diff --git a/AUTHORS b/AUTHORS index d113f274..588b3135 100644 --- a/AUTHORS +++ b/AUTHORS @@ -1,137 +1,142 @@ /*************************************************************************** AUTHORS - list of authors and contributors of Kwave ------------------- begin : Sat Nov 26 2005 copyright : (C) 2005 by Thomas Eschenbacher email : Thomas.Eschenbacher@gmx.de ***************************************************************************/ /*************************************************************************** * * * 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 is the list of people who have contributed code to the Kwave project. If you think that you should be listed here, or the description of what you have done needs is incorrect or incomplete, please let us know! Maintainers =========== Martin Wilz [historic] * creator of the project, active development 1998-2000 Thomas Eschenbacher * maintainer since 2000, core development Major Contributors ================== Aurelien Jarno * debian packager Carlos R * spanish translation David Flogeras * notch filter plugin * band pass plugin Gilles Caulier * french translation * splashscreen * tests and minor bugfixes Pavel Fric * czech translation Ralf Waspe * Help/About dialog Sven-Steffen Arndt * Kwave homepage * german online help minor contributors, copyright holders and others ================================================ +Sebastian Trueg , +Gustavo Pichorim Boiko +Michal Malek + * parts of plugins/export_k3b/K3BExportPlugin.cpp + Aaron Holtzman * libkwave/cpu_accel.cpp Bertrand Songis * french translation fixes * substitutes for patented libaudiofile code, debian bug 419124 [historic] Carsten Lohrke * svn r2163, patch for libaudiofile detection Chris Vaill * code base for the normalize plugin David Faure, * cmake/FindAlsa.cmake Diederick de Vries, * packaging for Crux Linux Espen Sand (espen@kde.org) + Mirko Boehm (mirko@kde.org) * K3AboutContainer (base of KwaveAboutContainer) Everaldo Coelho * the crystal icon theme http://www.everaldo.com/crystal/ Jaroslav Kysela * parts of plugins/playback/PlayBack-ALSA.cpp Jeff Tranter * parts of plugins/pitch_shift/PitchShiftFilter.{h,cpp} Juhana Sadeharju * plugins/band_pass/BandPass.{h,cpp} * plugins/lowpass/LowPassFilter.cpp * plugins/notch_filter/NotchFilter.{h,cpp} Kurt Roeck * svn r1370, fix for debian bug#288781, compilation for amd64 Mark Donohoe (KDE) * some icons and bitmaps for toolbar and GUI Martin Hinsch * Matrix.h Matthias Kretz, * cmake/FindAlsa.cmake Miguel Freitas * parts of libkwave/memcpy.c Richard Laerkaeng, * cmake/FindOggVorbis.cmake Rik Hemsley * plugins/record/LevelMeter.cpp * plugins/record/LevelMeter.h Robert M. Stockmann * packaging for Mandrake / X86_64 Stefan Westerfeld * parts of plugins/pitch_shift/PitchShiftFilter.{h,cpp} Jean-Marc Valin / Xiph.Org Foundation / Gregory Maxwell * base of plugins/codec_ogg/OpusDecoder.cpp Joerg-Christan Boehme * plugins/record/Record-PulseAudio.cpp * plugins/record/Record-PulseAudio.h ### EOF ### diff --git a/CHANGES b/CHANGES index d41d049a..e38d2fea 100644 --- a/CHANGES +++ b/CHANGES @@ -1,1251 +1,1252 @@ xx.xx.x [xxxx-xx-xx] * reduced flicker of position widget * bugfix: deleting labels per menu did not work + * new plugin: export to K3B project file 17.04.0 [2017-03-19] * use KDE versioning scheme * removed kwave.lsm and some now unneeded scripts (filter-pot.pl, get_lsm_entry.pl and set_version.sh) * simplified version number handling * eliminated cmake/FindOggVorbis.cmake * changed licenses of all cmake files to BSD license * bugfix: wrong assert in Stripe.cpp * OggOpus decoder: fixed unwanted data duplication (may lead to out-of-memory) * saveblocks: special handling for slashes in parts of a generated file name, e.g. title or meta data item - replace with similar unicode character * saveblocks: special handling for (multiple) whitespaces in parts of a generated file name - replace with single spaces * saveblocks: do not ask on every file in case that not all file properties are supported by the chosen encoder * saveblocks: use the block title (description of the left side label) as tile of saved block * bugfix: file was left in "modified" state after adding a label and canceling * re-activated the "label" menu * renamed command "add_label" -> "label:add" * renamed command "delete_label" -> "label:delete" * renamed command "edit_label" -> "label:edit" * implemented loading and saving of labels * allow special value -1 as index for label:delete(...) to delete _all_ labels * doc: split off developer sections from handbook into separate file, to reduce load of translators. new make target "html_doc_devel" (included in "apidoc") * label edit: avoid position from snapping too much away when adding a label in the gui while last edit was in percent mode * implemented moving of labels per mouse * show cursor line for orientation during drag&drop 16.12.0 [2016-11-28] * project moved from kdereview to kdemultimedia * added genre types 126..191 * record plugin: fixed crash when restarting record in MDI or tab mode * record plugin: reset did not work when clicking the "New" button shortly after starting the recording * record plugin: selection of default recording method did not work * revised use of signal handler in WorkerThread * WorkerThread: no longer use "bool" for signaling the wish to terminate, use QAtomicInt instead (also applies to Plugin class) * changed order of application object creation and setting up command line parser + about data * got rid of I18N_NOOP in main.cpp * bugfix: untranslated strings in menu * LICENSES file still mentioned Qt-4/KDE-4 libraries * CMakeLists.txt: remove RPATH settings * fixed small memory leak in menu group handling * fixed i18n of application AboutData * bugfix: internal name of "goto" plugin was wrong * bugfix: wrapper script did not work * fixed wrong encoding of error messages received via strerror and libs * bugfix: handling of File/Revert was wrong in case of newly created file 0.9.2 [2016-06-26] * recording via Qt Multimedia * using KDE service API for loading plugins * bugfix: screenshot function sometimes returned 1x1 image only (bug in Qt QWidget::frameGeometry is broken, but QWindow::frameGeometry works) * Gentoo ebuild updated to EAPI=6 * removed unneeded build and runtime dependencies * removed optimized memcpy for PowerPC * record plugin: improved handling of error messages * record plugin: added retry mechanism in case of device busy * added menu entries for recording and record setup * import of Core Audio Format (*.caf), using ALAC, A-LAW, U-LAW and IMA compression * import of Sample Vision Format (*.smp) * import of NIST SPHERE Audio File Format (*.nist) * import of Creative Voice files (*.voc) * import Audio Visual Research File Format (*.avr) * import of Amiga IFF/8SVX Sound File Format (*.8svx) * handbook: description of parameters of the record plugin was missing * handbook: fixed duplicate ":" in header of plugin parameter descriptions * made Kwave::SampleFormat and Kwave::Compression independent from libaudiofile 0.9.1 [2016-02-21] * ported to KDE Frameworks 5 (KF5) / Qt5 * playback via Qt Multimedia * bugfix: saved plugin parameter lists with escaped characters were not unescaped when loading again * compile fix for armv7l * codec_mp3: added missing "help" button to encoder setup dialog * fixed invocation of file dialog, as suggested by EBN * support for cmake > 3.3, fix for policy CMP0063 * cmdline option "--nofork" no longer exists * bugfix: multiple issues in context of switching the GUI type in scripts * bugfix: fixed issues in saveblocks plugin with special characters in filenames and patterns, format strings of second and later invocations of patterns were ignored * saveblocks: allow path separators in filename patterns to make it possible to create subdirectories * saveblocks: added patterns to include file info (file meta data) or the title of the current block * workaround for bug in KDE #345320 (missing translators in help/about dialog) * about plugin: added info about translation team * added screenshot of the edit_label dialog * bugfix: tooltips of the fileinfo dialog were not translated * new make target: "make msgstats" to show the progress of translations * compile fix for armv7l * playback: dropped Phonon support (was broken and no longer supported by KF5) * bugfix: hourglass cursor was not taken back in playback setup dialog * RPM: format of changelog has changed * changed plugin install directory and prefix/suffix * curve widget: use same colors as in frequency response widget, for better readability on bright color themes 0.9.0 [2015-05-25] * first version hosted on KDE (kdereview) and SourceForge * added command line parameter for selecting the GUI type * in MDI mode: new menu entry + function to arrange sub windows vertically * handbook: added text command reference * handbook: added plugin reference * enabled the "Help" buttons of all plugins and let them open the corresponding section in the handbook * make system: new target "update-handbook" (updates command, file info and plugin cross references) * make system: fixed dependency problem in translation * new commands: "window:sendkey", "window:screenshot", "window:close" and "window:resize" * built-in variable ${LANG} for kwave commands * support for delayed command execution * debug plugin: always compiled in, but only visible in debug build * new command sync(): wait for commands scheduled with delayed * bugfix: exporting a mono file as MP3 produced a stereo MP3 file * MP3: emphasis, copyrighted, original got lost during save/load * file info dialog: MPEG settings were not handled properly * bugfix: assert/numeric overflow in selectnextlabels() at end of file * new plugin: stringenter * bugfix: minimized windows were not migrated properly when switching GUI type * new command: window:minimize * bugfix: missing range check in noise generator (when used per script) * bugfix: saveblocks plugin did not work when omitting file extension * saveblocks plugin: use escaped strings for storing settings instead of base64 0.8.99-2 [2015-01-02] * bugfix: wrong sub window mode when switching to tab mode when having only one sub window (workaround for bug in Qt) * bugfix: recording did not work in MDI and Tab mode (wrong file context) * bugfix: fixed passing a text command as first command line parameter * new commands: delayed, window:click, window:sendkey, window:close, window:resize, window:screenshot 0.8.99 [2014-12-28] * GUI: implemented SDI, MDI and Tab GUI modes * bugfix: deadlock in class Track * bugfix: segfault during shutdown of logger * bugfix: segfault when unloading plugins (on some systems) * bugfix: "zoom to selection" was not disabled if nothing was selected * bugfix: toolbar buttons for cut/copy/erase/delete did not properly get enabled/disabled on change of selection * bugfix: overview widget did not properly refresh after deleting all tracks * bugfix: assert in vorbis decoder when opening file with bitrate -1 * menu subsystem: added support for lists within a menu * menu subsystem: show/hide toplevel menu entries * menu subsystem: added support for exclusive selection (radio buttons) * menu subsystem: let KDE chose shortcuts automatically * added menu entry to clear "recently opened files" list * implemented URL scheme for passing text commands from the command line example: kwave --iconic --disable-splashscreen test.wav \ kwave:plugin%3Aexecute?normalize \ kwave:save \ kwave:quit * using perl scripts creating for i18n from menus.config and for getting entries from lsm files, no longer need awk, sort, uniq * creating menu translation template directly per perl script instead of generated dummy cpp file (requires "msgcat") * menu translations: assign a context to each menu entry * bugfix: division through zero on ogg files with invalid bitrate info * manual: added section about GUI types * i18n: translations were missing in kwave.desktop 0.8.12 [2014-06-04] * recording via PulseAudio, by Joerg-Christan Boehme * bugfix: "Close" button of the record dialog did not save settings * bugfix: amplify free plugin: untranslated action names in progress bar * bugfix: sonagram plugin did not honor the windowing function parameter * bugfix: coherency problems in overview cache * bugfix: metadata got lost after cut/undo/redo * bugfix: save/as check against overwriting existing files failed * bugfix: undo/redo did not work after recording * bugfix: signal was "modified" after canceled record (empty) / done * bugfix: wrong calculation of zoom and window geometry at startup * bugfix: wrong scaling of overview in sonagram window * bugfix: playback pointer did not update synchronously across tracks * bugfix: brought back support for optimized memcpy (from xine-lib) * updated memcpy.c + cpu detection, including AVX assembler support * new command line option: "--logfile=" for logging to a file * brought back the horizontal scroll bar * support for swap files to store undo data * speedup: too many copy-on-write operations, use more const data * improved robustness against out of memory situations * memory manager: added statistics for debugging * memory settings: only use up to 25% of process address space * internal cleanups: renamed openSampleReader -> openReader, fixed signature of Signal/SignalManager::openWriter * speedup: use stripe list instead of raw data for saving undo data * debug plugin: added functions "labels_at_stripes", "sawtooth_verify" and "dump_metadata" * automatic defragmentation of stripes * sonagram plugin: use Qt Concurrent framework -> more than factor 40 faster on a quad core cpu * got rid of KDE ThreadWeaver, replaced with Qt Concurrent framework * debug plugin: added function "fm_sweep" * workaround for broken WAV files with zeroed fact chunk * fixed many 32/64 bit issues * new build target "make wrapper": creates a wrapper script to start Kwave for test/debug purpose * new build target "make dep": creates a binary debian package (for personal use and testing purposes) * mouse wheel + Ctrl: zoom in/out aligns signal to mouse position * record plugin: level meter is always enabled, simplified dialog * PulseAudio playback: fixed wrong timeout calculation * requires at least Qt-4.7 + FLAC-1.2.0 0.8.11 [2013-11-24] * added spanish translation, provided by Carlos R. * bugfix: file names were not properly escaped in context of file/open, file/openrecent and drag&drop * bugfix: saveblocks() did not abort properly when pressing cancel * unclean shutdown of the file progress dialog when saving * noise plugin: add noise (mix) instead of overwrite, with adjustable level in percent or dB * pause button: change tooltip to "continue" if paused * new command line option: "--disable-splashscreen" * new command line option: "--iconic" to start minimized * fixed quoting errors in CMakeLists.txt (cmake-2.8.12 complained) * bugfix: ASCII encoder: escape special characters in meta data * implementation of ASCII import * memory settings: raised default memory limits * bugfix: crash in file info dialog / auto generate keywords * MP3 plugin: use ID3 tag TSSE for software version * ASCII codec: implemented support for labels 0.8.10 [2013-02-09] * file name cleanup: removed "Kwave" prefix * bugfix: added range checks for track selection commands * reverted changes in sample writer due to problems in debug mode (commits ee54660d4380d264b7346a904eff9dd8d8d00a93 and 6fba04db879ea7ae1fdf79141dd93d47f9c1d403) * bugfix: unwanted termination if splash screen closed while the first toplevel widget still was starting up * moved code into namespace "Kwave" * cleanup: remove support for outdated FLAC API versions below 1.1.3 * removed unused code: libkwave/FileFormat.* * renamed source files with "Kwave" in the name * added subsystem prefix to inclusion of Qt header files * using bit types from qt (e.g. u_int32_t => quint32) * compile with DQT_NO_CAST_TO_ASCII and QT_NO_CAST_FROM_ASCII * bugfix: recording via OSS did not handle invalid devices properly * improved auto detect of svg-to-png conversion, added support for "rsvg-convert" (SF bug #38) * removed dependency to ImageMagick if "rsvg" is available * replaced libkwave/byteswap.h with generic Qt functions * replaced some Qt classes with their KDE equivalent: KLineEdit, KComboBox, KDialogButtonBox, KPushButton, KTabWidget, KTextEdit * using KDE standard buttons in dialogs * simplified plugin loading mechanism, do load/unload only at start/end of the program * delete plugin settings of old versions when detected * using QLibrary instead of functions from libdl * bugfix: shutdown sequence was incomplete * bugfix: keyboard shortcut for first menu entry did not work * bugfix: ambiguous keyboard shortcut for "File/New Window" * bugfix: undo of "modify label" caused loss of other labels * bugfix: use timeout for phonon playback, to avoid hang on unusable devices * using klocale for formating numbers of samples * added common base class for all codec plugins * reduced quality level of sample rate converter from "best" to "medium", to improve speed * refactored playback handling (controller vs. plugin) * workaround for bug in Phonon: no device names available in first call to Phonon::BackendCapabilities::availableAudioOutputDevices() * moved playback test into worker thread, for better GUI responsiveness * Phonon playback: changed to own mainloop with timeout support to avoid application hang on broken audio devices * bugfix: data loss in sample rate converter when processing streams * vorbis encoder: call to deprecated API (now use OV_ECTL_RATEMANAGE2_SET) * using estimated length for streaming file formats without length info * made sample rate conversion (libsamplerate) mandantory * increased default memory sizes * added toolbar buttons for "File/SaveAs" and "File/Close" * reordered toolbars 0.8.9 [2012-11-06] * new feature: MP3 export via external program "lame", "toolame" and "twolame", with configurable command line options * new feature: allow change of compression type via file info * fix for SF #3528848, removed -Wl,--add-needed from plugin LINK_FLAGS * speedup: improved performance of sample writer * wav import/export: support for some more meta data tags * bugfix: meta data lost when writing wav files that had meta data for product/album or subject/track at the same time * bugfix: broken signal/slot connection in SaveBlocks plugin * workaround for bug in id3lib, SF #3534143: ignore id3lib crc check result for MPEG Layer II files * bugfix: Gentoo ebuild lacked required svg use flag for media-gfx/imagemagick and media-gfx/graphicsmagick * bugfix: File/SaveAs now uses last recently used directory and extension together with the user defined file name * bugfix: PluginManager::sync caused application slowdown or stale GUI 0.8.8 [2012-05-20] * new feature: seek functionality for playback * new feature: added toolbar with record/playback/scroll functions * migration to GIT as source code management * documentation update * allowing zoom and scroll while a plugin is running * allow "close" and "quit" while playback is running * allow track selection change during playback * fix for namespace collision with libaudiofile * bugfix: mouse selection update with negative offset failed * bugfix: wrong focus of progress dialog when repairing damaged wav files * bugfix: missing updates of zoom selection combo box * bugfix: when viewing with full zoom, scroll by 1 sample was possible * bugfix: focus was wrong on program start (zoom combo box) * bugfix: wrong view when moving slider of overview widget to negative value * bugfix: playback pointer did not disappear after play - pause - stop * bugfix: creating a label without text was not possible * bugfix: saving WAV with G.711 and non-16bits/sample produced broken output * bugfix: handling of shortened tracks in encoders 0.8.7 [2011-11-27] * ebuild update for media-gfx/imagemagick <-> media-gfx/graphicsmagick (see gentoo bug #314325) * new feature: "insert at", paste clipboard at given position * fix for API change in libaudiofile v0.3.1 * speedup: loading ogg/mp3 is much faster now (up to factor 2) * bugfix: stream name of pulse audio playback used wrong encoding * update of the Kwave spec file (synced with OpenSuSE build service version) * new build target "distfiles" * updated version of the GPL v2 document (GNU-LICENSE) * support for visualization plugins 0.8.6 [2011-03-07] * bugfix: copy/paste with partial track selection failed * bugfix: labels update after undo of copy&paste failed on multitrack signals * string/i18n update from Panagiotis Papadopoulos * bugfix: invocation of xgettext was wrong, left untranslated strings * plugin API change: support for translateable short description * about plugin: use plugin info from PluginManager * bugfix: last directory of file dialogs sometimes got lost * bugfix: wrong message when canceling Ogg import * replaced sched_yield() with QThread::yieldCurrentThread() * added cmake parameter for disabling optimized memcpy support -D WITH_OPTIMIZED_MEMCPY=OFF, default is ON * integrated patch #3021795 for Qt-4.7 compatibility * bugfix: optimized memcpy for PPC (SF bug #3068664) * doc: upgrade to DocBook XML V4.2 / V1.1 * build fixes for qt-4.7 * no longer using QSplashScreen (has side effects, operates as modal window) * bugfix: startup as unique application did not work correctly * bugfix: potential crash in message loop of progress dialog * bugfix: handling of track selection was wrong in reverse plugin * workaround for bug in libaudiofile: some files have sampe rate zero, falling back to 8000 samples/sec in that case (audio/x-ircam, sun, BE) * bugfix: reverse failed on files smaller than the internal block size * using entities for URLs in handbook, to simplify maintenance * bugfix in cmake files: some invocations of STREQUAL lacked quotes 0.8.5 [2009-12-24] * new feature: playback via PulseAudio * applied kwave-0.8.2-nolinguas.patch (see gentoo bug #267702) * support for the Gentoo build system that steals .po files * no longer default to english language for documentation and gui l10n * fixed use count mismatch of plugins * bugfix: playback control: continuing after pause continued from start * bugfix: G.711 encoded wav files support only 16 bit signed format * new assignment for mouse wheel: - without modifier key: scroll left/right - with Shift: page left/right - with Ctrl: zoom in/out - with Alt: vertical zoom in/out * bugfix: support sysinfo.mem_unit when >= 4GB RAM are installed * bugfix: crash in progress dialog handling (crashed when closing a plugin after finishing it's work) * new ebuild for Gentoo 0.8.4 [2009-09-26] * new feature: support for primitive macros (batch files), playback only * new plugin: change sample rate * using libsamplerate (new dependency) * new feature: sample rate conversion on clipboard data * new feature: ability to set recording start time in advance (feature requested by John David Thompson) * bugfix: drag&drop of files on the main window was broken * workaround for bug in id3lib which crashed in ID3_Tag::GetSize() with some MP3 files (see id3lib upstream bug at SF #2821464) * bugfix: recording via ALSA, crash on snd_pcm_close(), see SF bug #2816544 * bugfix: playback plugin: infinite loop when switching from OSS to ALSA * bugfix: forcing clipboard and drag&drop data to uncompressed mode * bugfix: deadlock in progress bar handling * bugfix: crash when unloading plugins with queued events * help/about dialog: hide "translators" tab if no translator available * help/about dialog: hack to allow web addresses of translators * bugfix: selection was not set after "paste" and undo of other operations * bugfix: label handling in context of "delete" and "undo" was broken * bugfix: invalidation of overview cache after delete was not correct * bugfix: artifacts in track display in min/max overview mode * bugfix: add/delete/modify of labels did not set the state of the current file to "modified" * bugfix: record dialog caused shutdown to hang when closed while recording * bugfix: decoding 32bit/sample was broken * bugfix: recording level meter consumed 100% cpu * new make target: "make apidoc" for internal doxygen documentation * bugfix: some images and icons in non-english documentation were missing * volume plugin: preview was not updated on first use of plugin 0.8.3-2 [2009-07-04] * bugfix: re-enabled detection of optimized memcpy function * bugfix: deadlock in recording plugin and plugin management (see SF bug #2816544) * bugfix: ID3 tag import did not work * taking ID3 tag for "album" as "product" in wav meta data * taking ID3 tag for "track" as "subject" in wav meta data 0.8.3 [2009-06-28] * integrated 05-do-not-install-so-symlinks.diff from Debian (thanks to Aurelien) * cs i18n update from Pavel Fric * new plugin: normalize * progress bar in volume plugin did not work * flattened "Fx" menu, no submenus for amplify and filter * bugfix: workaround for libaudiofile bug produced wrong header in 24bit/sample mode * bugfix: "fade outro" was broken * bugfix: the dialog when playing the test sound in the playback setup dialog did not appear * replaced qreal with double (fixes build problems on arm) * show hourglass / progress bar when undo/redo is running * flattened "Calculate" menu, no submenus for "Frequencies" * wav encoder: auto-switch to unsigned format for <= 8bit and signed format for > 8 bit per sample * volume plugin: show a little "preview" for guessing the level * bugfix: after deleting a track, file info was not updated * about plugin: separate tab for translators * made plugin API version configurable per plugin * recognize mime type "audio/x-vorbis+ogg" (found in KDE-4) * updated czech gui translation and user manual from Pavel Fric * bugfix: crashes when deleting objects that still have event queued with Qt::QueuedConnection -> now using Qt::BlockingQueuedConnection * new plugin: reverse * speedup: limiting the number of progress bar updates per second * memory manager: fixed multithreading issues, improved OOM behavior * bugfix: received SIGBUS in SwapFile when disk was full * improved performance of memory management * require Qt4 v4.5.0 or newer 0.8.2 [2009-04-25] * bugfix: minor off-by-one bug in buffer handling * wav/RIFF parser: be more robust if the file has not been correctly padded * bugfix in wav encoder: padding for info and label chunk was missing * bugfix: if two markers were too close and displayed at the same pixel position they eliminated each other through XOR mode * bugfix: numeric overflow when trying to select labels in high zoom factors * bugfix: not all positions were selectable due to internal rounding errors * silence plugin now supports all modes * use "unsigned" sample format per default when creating new files with <= 8 bits/sample * bugfix: playback position was shown on startup * bugfix: show correct file size in progress dialog * bugfix: crash when deleting label from end of signal * bugfix: overview was wrong when deleted space after signal was visible * bugfix: overview was not always synchronized after delete/insert * bugfix: "modified" state got lost during undo * use ALSA per default for playback/record if nothing has been selected yet * fixed calculation of undo/redo sizes * undo/redo handling for sample range and track selection * processing updates of overview widget in a background thread * memory management: no longer evaluate RLIMIT_RSS, gives more available physical memory * portability fix: swapfile creation/destruction went wrong * feature: memory for undo/redo can now be configured * bugfix: handling of "continue without undo" produced wrong undo/redo states and asked several times * bugfix: file progress did not do GUI updates, cancel button did not work * bugfix: assert in record plugin if no valid sample rate available * speedup for generation of signal overviews in min/max mode * bugfix: MultiTrackWriter produced one extra sample (off by one error) * workaround for bug in libaudiofile: sometimes libaudiofile produces broken files as it uses 'float' for internal calculations (wrong size of 'data' and 'RIFF' chunk) => see ubuntu bug #327018 * implemented "debug" plugin, with internal functions for test and verification (quality improvement) * added czech gui translation from Pavel Fric * bugfix: after creating a new empty file, "revert" was possible * speed optimizations in buffer handling * speedup: limiting the rate of progress updates when loading and saving files * fixed displayed names of actions based on the "amplifyfree" plugin * bugfix: menu entry translation did not work correctly * bugfix: deleteLater on menu nodes did not work, implemented own garbage collector * speedup: use different block sizes for interactive and non-interactive mode * i18n fix: texts in help/about menu were untranslated * about plugin: new tab for translators 0.8.1 [2008-12-23] * replaced application icon, now using a scalable svg image * replaced GSL with FFTW3, which is license compatible with Kwave * use implicit sharing for Label class * new clipboard implementation, using the clipboard of KDE (X11) * fixed enable/disable of copy/paste functions depending on clipboard state * re-enabled function "flush clipboard" * re-enabled function "invert track selection" * re-enabled function "select all tracks" * implemented plugin for "go to position..." * added status bar item for current cursor position * show current playback position in status bar * show selection in overview widget * bugfix: mode switch in time selection widget did not work properly * bugfix: handle situation when adding or moving a label to a location that is already occupied by another label * show labels in overview widget * show current playback position in overview widget * overview widget: dimming parts that are out of view * no longer needing built in copy of libaudiofile, removed 0.8.0 [2008-09-27] * ported to KDE4 / Qt4 * dropped support for FLAC API v1.1.1 and older * support for ALSA lib API v1.0.16 * made MP3 decoder disabled per default due to legal issues * fixed bug in cue list parsing of .wav files * fixed bugs in recording plugin, recorded too much if recording time limit was activated or in prerecording mode * a much nicer splash screen * bugfix in label handling: support labels with zero-length names * re-arranged source files for cleaner library interfaces * re-enabled accelerator keys for 0..9 * using horizontal scrollbar instead of overview widget * implemented vertical zoom (Ctrl + MouseWheelUp/Down) * using more standard KDE keyboard shortcuts * nicer icons for the menus * using more icons from the crystal icon collection (to clearify the license situation) * removed aRts support * now also available through the openSUSE build service for various platforms * respect the LINGUAS environment variable to build only needed languages (defaulting to all) * removed changelog from online manual to simplify the work of translators * no longer dependent from "recode" * recording plugin: show current recording time in status bar * fixed infinite loop on undo/redo of channel selection * usage of GSL can be disabled through cmake parameter -DWITH_GSL=OFF * support for OSS v4 (integrated sf feature request #1870434) 0.7.11 [2007-12-09] * new internal streaming architecture, based on Qt instead of aRts * aRts support is now disabled per default * some minor bugfixes for x86_64 support * band pass plugin 0.7.10 [2007-08-08] * build system: using 'METASOURCES=AUTO' (which simplifies a lot) * ported the build system to cmake * support for newer APIs of FLAC v1.1.3 and v1.1.4 (closes SF bugs #1713655 and #1757716 + debian bugs #427747, #426668 and #431199) * replaced problematic code in libaudiofile with new code under the LGPL, contributed by Bertrand Songis (partially fixes debian bug #419124) * update of the online documentation to reflect the change of the make system 0.7.9 [2007-05-01] * playback via ALSA: offer the "default" device, if no devices found offer the "null" device * implemented import and export of labels, currently only for uncompressed wav files * new plugin for saving blocks between labels as separate files * new function: expand selection to labels * new function: select next/previous range between labels * bugfix: don't change the file name when saving only the selection * new configure option: --enable-doc=yes/no to enable/disable the generation of the online documentation (default=yes) 0.7.8 [2006-12-31] * bugfix: workaround for bug in ALSA, crashed when initializing the dsnoop plugin * bugfix: error in swap file handling, one sample was destroyed when resizing. Affects cut, delete, crop and many other functions. * fixed the incorrect usage of the word "loose" (thanks to J.T. Hundley) * bugfix: went back to old implementation of ThreadsafeX11Guard class in order to fix a deadlock (closes sourceforge bug #1623357) * documentation update: mention Subversion instead of CVS * zero plugin: new mode, support for inserting a range filled with silence * fixed the macro functions "Fade Leadin" and "Fade Leadout", using the new mode of the 'zero' plugin * export of ASCII format files 0.7.7 [2006-09-17] * new feature: implemented a small widget that shows the current selection position and the selection borders * new feature: context menu for the signal widget (right mouse button) * improved file open dialog: show "All Files" and "All Supported Files" * bugfix: error in handling of mouse selection * bugfix: recording only used the first channel (closes sourceforge bug #1551050) * install plugins kde_moduledir/plugins/kwave instead of kde_datadir/kwave/plugins 0.7.6 [2006-06-05] * bugfix: recording setup crashed when called for the first time * bugfix: do no longer crash when recording device is not present or opening failed * bugfix: fixed generation of rpm dependency for libmad * bugfix: update the size of the level meter if the dialog size has changed * record plugin: added a fancy status bar * record plugin: added autodetect/scanning for OSS devices * record plugin: added dsnoop plugin as ALSA source * record plugin: fewer annoying message boxes, instead show a short notice in the status bar for some seconds * record plugin: add logarithmic scale to the level meter and use 3 colors * playback plugin: added autodetect/scanning for OSS devices * playback plugin / ALSA: support for 18 and 20 bits/sample * playback plugin / ALSA: support for big endian 0.7.5 [2005-12-31] * draw signal in a different color set when not selected * bugfix: solved deadlock situation when starting a plugin while another plugin was still running * workaround for deadlock when trying to close the current file while a plugin is still running * bugfix: delete range only in selected tracks * thrown over board the idea of using gstreamer due to serious license issues, we will wait until KDEMM is out (KDE-4) instead. 0.7.4 [2005-10-16] * recording via ALSA * support for the silently changed API of libFLAC++ v1.1.2 (closes sourceforge bug #1243707 + debian bug #289953) * fixed support of MMX / SSE detection on X64_64 architecture (closes sourceforge bug #1244320 and debian bugs #288781 + #327501) * decided to support gstreamer as streaming engine in future versions (will make v0.8 if Kwave is aRts-free) * fixed some German translations (closes debian bug #313790 and bug #314000) 0.7.3 [2005-05-26] * playback via ALSA * completely new playback settings dialog, with support for aRts, ALSA and OSS * playback plugin: play a test sound * record plugin: detect when device is alread open, now no longer blocks. Show an error message. * smoother signal display in overview mode (no gaps) and improved polyline mode * replaced some of Kwave's multithreading classes with classes from Qt * compiles under SuSE-9.3 * ebuild file for Gentoo Linux 0.7.2 [2004-12-31] * big rework of the internal streaming/storage subsystem, support for multiple stripes. Makes a big speedup when handling large files! Creating an empty 512MB file before: over 350 sec, now: about 25 sec (on my system) * optimized versions of memcpy() for ix86 (using MMX, MMXEXT, 3DNOW, SSE, SSE2) and for PowerPC, copied from the xine project * some support for X86_64 * bugfix: in memory setup plugin, set virtual memory limit only if the limit has been enabled (checkbox is clicked) * bugfix: clipping in Ogg import filter was incorrect * speedups: import of Ogg and MP3 files improved * removed code copied from the GSL library, link against the shared library instead * added target "package-messages" to the toplevel Makefile, for translators 0.7.1 [2004-07-10] * FLAC (Free Lossness Audio Codec) import/export plugin * speedups for loading / saving files * removed our own copy of libmad from the source tree, now it should be available in all common distributions * implemented pre-recording * implemented recording time limit * bugfix: minor bug in the recording state machine * bugfix: solved some layout issues in the about- and sonagram plugins * bugfix: cancel while saving to .ogg works now * update of the online documentation, many screenshots * improved Makefile dependencies of the plugins, now parallel builds also work and speed up the creation of plugins 0.7.0 [2003-12-01] * first version with recording functionality (still alpha) * removed workaround for uic invocation * bugfix: handling of persistent and unique plugins was wrong, which caused playback to work only in the first main window instance * added project files for kdevelop-3 0.6.7 [2003-06-28] * new plugin: "pitch_shift" * new plugin: "lowpass" * new plugin: "notch_filter", contrinuted by Dave Flogeras * included a bugfixed version of the synth_pitch_shift aRts plugin * new feature: "pre-listen", first implementation in pitch_shift plugin * ported to work with Qt-3.1 without Qt-2 compatibility, also compiles with -DQT_NO_COMPAT -DQT_CLEAN_NAMESPACE 0.6.6 [2003-03-29] * works with KDE-3.1 * many improvements on the build system. Now compiles under Debian, Mandrake, RedHat, Gentoo and SuSE * starting up with last window size * Xt toolkit option for geometry works again, including workaround for bug in KDE3's geometry management. example: "kwave -geometry 800x600" * bugfix: select to left selected one sample less then needed * volume plugin: simple clipping * volume plugin: mode for "multiply with /divide through factor" * newsignal and selectrange plugin: got rid of KDoubleNumInput and it's weird display and entry behavior * selectrange plugin: also select start position of selection * can use libmad and libaudiofile from the host system if usable * show the fileinfo plugin when saving under a different mime type 0.6.5 [2002-11-09] * MP3 import with ID3 tag support through id3lib and libmad * Ogg/Vorbis import and export (only ABR mode) * new plugin "volume" * show selected range as time (feature requested by Christian Hollaender) * support for saving compressed .wav files * thrown away Qt2/KDE2 compatibility, now only supports Qt3/KDE3 * playback plugin: enabled the "select..." button for choosing other playback devices (feature requested by Len Ovens) * solved problem with name mangling in plugins and different gcc versions * works with gcc-3.2 / solved __dso_handle problem * stricter checks for programs in configure script 0.6.4 [2002-06-30] * support for different file formats / integrated libaudiofile * drag and drop bugfix: dropping into the same signal left from the selection removed wrong range * auto-repair for structurally damaged wav files * bugfix: save selection works again * integrated libkwavemt into libkwave * using time instead of zoom factor, e.g. set zoom to "1 minute" (feature requested by Gilles Caulier) * menu entries for playback control * some more icons in the menus * replaced KFileDialog with subclass KwaveFileDialog (works around some bugs in KDE) * added a little chapter about digital audio basics to online help * added "select range" plugin 0.6.3 [2002-03-01] * simple drag and drop * french translation * handling of "signal modified" * shows error message and aborts if loading failed 0.6.2 [2001-12-24] * new plugin "amplifyfree" * new plugin "noise" * >>> new aRts plugin adapter framework <<< now Kwave is able to use existing aRts plugins in it's own plugins for sound processing * changed documentation to XML / Docbook-4.1 * recovery of damaged files if non-zero file length but data length entry in the wav header is zero (e.g. happens when krecord crashes during recording) * bugfix: freeing virtual memory fixed in MemoryManager * bugfix: problem with TSS in TSS_Object cleanup 0.6.1-1 [2001-09-01] * bugfix: class Track made duplicate entry in stripe list when inserting signals into an empty track * fixed that weird layout behavior in dialogs, seems that Qt has problems with complex nested layouts :( 0.6.1 [2001-08-24] * >>> USE OF VIRTUAL MEMORY <<< * changed Makefiles: html docu stays in distribution due to too much trouble with the KDE documentation tools * when inserting from clipboard into a signal with a different number of tracks, the result will be mixed (still not optimized/slow) * fixed compile problem with gcc-2.96 / gcc-3.0 * fixed missing header file in NewSigDlg.ui * the RPM should be relocatable again * fixed bug in shutdown sequence, now clipboard is flushed before the application closes. 0.6.0 [2001-07-29] * >>> PORTED TO QT-2 AND KDE2 <<< * completely new internal architecture * plugins can be located in a user directory * libkwave is included and no longer supported (at least by me) as a separate package * playback via aRts * many more bugfixes, too many to mention here... 0.5.5-1 [2001-02-23] * bugfix: selection across end of file no longer possible * bugfix: no overflow in wav header when saving large wav files above 268MB (bug reported by Sven-Steffen Arndt, ssa29@gmx.de ) 0.5.5 [2000-12-01] * new playback handling, allows pause/continue * limited the playback buffer to be between 256 and 65536 bytes due to problems (system hang) with small playback buffers with 16..64 bytes (might be a hardware problem) * introduced a toolbar for some standard operations * fixed some bugs concerning selection with the mouse * rework of the overview widget (used in main window and sonagram) * fixed menu command "zoom selection" * sonagram: saving to file, auto-brightness adjust * replaced QFileDialog with KFileDialog * tested with AMD Athlon-optimized compiler (patched pegcs) * some fixes for safer multithreading * checking for much more header files at configure time (due to a problem reported by issiac@evcom.net ) 0.5.4-4 [2000-10-03] * added classes Mutex and MutexGuard * sonagram: set a transparent background for the image * added sizeHint() and minimumSize() to ScaleWidget and OverViewWidget * sonagram: removed (need for) SonagramContainer, using QGridLayout instead * moved SignalProxy to the mt subdirectory * fixed X11 synchronization problem with SignalProxy * added TSS (thread-specific-storage) support to the mt classes * added some multithreading support classes: Thread, AsynchObject, ... * removed the "get" prefix from all member functions. This is the new KDE/QT coding style. * updated the online documentation to point to the new Kwave homepage on http://kwave.sourceforge.net/ * class ImageView: always repaints (maybe image data has changed) * bugfix: selection and playpointer will not be drawn if no signal is loaded 0.5.4-3 [2000-09-09] * the sonagram window updates it's title if the signal's name changed * found a solution for the problem of synchronizing X11 and QT in a multithreaded environment * fixed bug in the "Halt" function (playback) 0.5.4-2 [2000-08-20] * geometry/layout management for the MainWidget * limited the displayed height of a signal. If not all signals fit onto the screen, a scrollbar appears on the right side of the signal. * limited the size of the TopWidget to a reasonable minimum size * automatic dependencies for the plugins work again 0.5.4-1 [2000-07-29] * fixed layout of playback dialog * started to implement a new plugin interface * geometry/layout management for the sonagram settings dialog * formatting of selection and file time (KwavePlugin::ms2string) * plugins can now consist of multiple source files 0.5.4 [2000-07-12] * some more minor changes to the Makefiles * split the documentation output into "de" and "en" part * made symbolic links to the english help directory from the "de" and "default" directory during make install and uninstall and also in the post and postun scripts of the specfile The user should at least get the english help... * alpha version of english documentation done * automatic update of the revision history in the docbook file if this file is modified (only english version) * CVS is up on sourceforge.net * changed some header lines in this file * started on writing a new documentation / online help using docbook 0.5.3 [2000-06-12] * if a file with invalid size (e.g. recorded by "arecord") is loaded, shows a message and truncates the input at the end of the file * found out that we need ALSA support for 24 and 32 bits/sample * >>> playback in stereo <<< * selected channels (x) are mixed to the output device's channels (y) at playback using a x:y translation matrix with linear scaling, all values for x and y except zero are allowed * playback only for selected channels * rework of the settings/playback dialog (plugin) * heavy reword on the playback code * fixed severe bug in SignalManager::readWavChunk(), chrashed if there was data after the wav chunk 0.5.2-12 [2000-06-02] * copied the AsyncSync class into libgui, should be used for threadsafe usage of the qt library * moved handling of the "selected" flag from class SignalManager to class Signal * fixed selection of channels if appended or deleted 0.5.2-11 [2000-05-28] * included config.h in each source file (except the plugins) * export to ASCII for multi-channel signal (multi-channel import has still to be done, currently only mono) * fixed many memory leaks and inconsistent delete operations (e.g. used "delete" instead of "delete[]") * included support for (and tested with) the error detection and memory debugging tool "Insure++ Lite 4.1" (./configure --enable-insure=yes ...) -> thanks to ParaSoft Corporation for making this limited version of the tool available (http://www.parasoft.com) * SignalWidget uses three layers for drawing, speeds up the redraws after mouse selection by about factor 14(!!!) on my system :-)) 0.5.2-10 [2000-05-21] * some minor bugfixes in the Makefiles * save the kwave.spec and include it into the source archive, this lets "rpm -ta kwave-x.x.x-x.tar.gz" work * wrote a new README file, moved Martin's version to README.OLD * RPM_OPT_FLAGS are appended to the compiler options, this lets pentium optimizations work :-) * shows a message box if loading of a file failed 0.5.2-9 [2000-05-19] * list of recent files is synchronized across all toplevel windows * fixed dozens of memory leaks, missing ASSERT constructions, missing variable initializations and possible divisions through zero * Help menu aligned to the right side (MenuRoot now is able to process the special command "#separator") 0.5.2-8 [2000-05-18] * replaced all occurances of sprintf with snprintf, strcpy with strncpy (in 92 places) ! * doesn't show any zoom factor if no signal is loaded * handling of channel add/delete: selection/speakers are shifted * changed some variables/parameters to "unsigned" (simplifies range checks) * beautified this file * beautified the whole source code according to my favorite coding style. -> thanks to the developers of the "Artistic Style" package, astyle-1.11.4-1 made good work :-) * fixed that annoying flicker in the help/about dialog * checking for sizes of char, short and int at configure time * globals.app will not be used (obsolete, should be removed from libkwave) * MessagePort will not be used (obsolete, should be removed from libkwave) * multiple toplevel windows are possible * made X toolkit parameters work (especially "-geometry") * bugfix concerning loading/saving 8 bit .wav-files (always unsigned !) * >>> COMPLETE REWORK OF THE INTERNAL COMMAND STRUCTURE <<< - made use of a combination of signals/slots and string messages - hierarchical processing: commands are are forwarded "upwards" until they reach a TopWidget - the TopWidget (highest level) dispatches the commands and forwards them to the lower levels 0.5.2 [2000-04-24] * rpm package should now be installable without conflicts and compile without any previous installation of kwave * removed the "${KDEDIR}/share/doc/HTML/default" directory from the rpm so that it doesn't conflict with the already existing one * shift+Home/shift+End selects from the current left/right position up to the start/end of the signal * bugfix in display of signal: signal is no longer inverted * selectrange() works now * the zoom factor combo box reflects the current "real" zoom factor * some bugfixes in menu handling / cleanups * complete rework of zoom and offset handling: - simple poly-lines instead of lowpass interpolation if zoom factor has less than 10 pixels per sample - lowpass interpolation if more than 10 pixels per sample * bugfix in KWaveApp: now sets globals.app to this if it was null before, now doesn't crash if it loads a file specified at cmdline 0.5.1-4 [2000-04-16] * >>> now compiles and runs under RedHat 6.1 / Halloween IV <<< >>> as well as under SuSE 6.2 <<< * version info of libkwavegui.so is set to the package's version * bugfix in plugins/template/Makefile.am: will not create .moc files on make distclean and other targets * compiler flags are passed through to plugin compilation * compiling with --no-rtti. This was necessary to compile against the kde libraries of RedHat that seem to contain no rtti. As a side effect all warnings on linking programs/libs disappeared :-) * configure-parameter --enable-debug has effect again * >>> ASCII import and export works now (mono only) <<< * bugfixes in some plugins, all compile now without warnings/errors * plugins are processed in alphabetical order * all plugins are automatically found and compiled * new target "make src.rpm" makes only the source rpm 0.5.1-3 [2000-04-03] * display will be scrolled left or zoomed if something from the end of the signal is deleted * curve parameters of fade in / fade out work again 0.5.1-2 [2000-03-16] * converted many "klocale->translate(...)"s into "i18n(...)" * target "make messages" works again * converter for menus.config, creates a dummy .cpp-file that is handled by i18n 0.5.1-1 [2000-03-13] * new target "make rpm" creates binary and source RPM packages * fixed the shared-library-problem in the build system 0.5.1 [2000-02-28] * menu items can belong to groups * renamed SignalWidget::info to "refresh" * many cleanups in the header-Files in src and libgui * the menu management has completely been rewritten: - Menu, NumberedMenu and MenuCommand classes are deleted - new classes: MenuNode, MenuItem, MenuSub, MenuToplevel and MenuRoot * menu items can have icons * menu nodes can have unique string ids * special menu commands start with a "#" * first attempts for internationalization * list of recent files is sorted by time of last usage 0.5.0-1 [1999-12-27] * moved my modifications from the Makefiles to Makefile.am * included targets "make release", "make patchlevel" and some scripts 1999-12-19 (by Thomas.Eschenbacher@gmx.de) * remade my modifications of some Makefiles and of the configure script that were lost during Martin's changes * changed shortcut for mixpaste from CTRL-SHIFT-X to CTRL-SHIFT-C * added the "crop" command to the edit menu * made the "mixpaste" command work * corrected the call of "delete", now really deletes instead of cutting and copying the selection to the clipboard (saves clipboard content) 1999-12-18 (by Martin Wilz ) * changed filenames to reflect class names * one class per file is now the standard * stripped leading "Kwave" in class names for most classes 1999-12-10 (by Thomas.Eschenbacher@gmx.de) * removed -Werror compiler option (caused trouble with configure script) * fixed a nasty bug in SignalManager::save that caused crashes on several positions in the program and libstdc++ 1999-12-09 (by Thomas.Eschenbacher@gmx.de) * gave the destructor of SignalManager some code, this fixes a huge memory leak ! * added a TODO file * added -Werror to the c++ compiler options when debugging enabled * some include file cleanups in libgui 1999-12-07 (by Thomas.Eschenbacher@gmx.de) * SignalManager::writeWavChunk uses buffers for writing (much faster!) * bugfix: caption of main window changes after "SaveAs" * bugfix: selected resolution takes effect * bugfix: caption of main window changes after "SaveAs" * bugfix: SignalManager::writeWavChunk now doesn't destroy the signal's data while saving * make distclean in the projekt root directory also removes zero-length files, *.orig, *.rej and *~ (just makes cleaner than before) * symbolic links to Makefile, Makefile.in and Makefile.am in the plugins directory are deleted with "make distclean" and rebuilt on "make" (changes in the referenced Makefiles in the template directory will not be reflected thousand times when creating a patch with diff) * cleanups, removed some old backup files * improved support for debugging accessible through * "configure --enable-debug=yes" (-g and -DDEBUG compiler flags) * rewritten big parts of Makefile.in for the plugins * added -O2 compiler optimization 1999-12-03 (by Thomas.Eschenbacher@gmx.de) * merged with Martin Wilz's version 1999-11-12 (by Martin Wilz ) * version numbering script donated by Thomas Eschenbacher * now using KTMainwindow for top level widgets * using timer to check message port -> alternative (threadsafe) message passing instead of signal/slot * labeling code rewritten, now incompatible with old releases * batch loading routines 1999-09-07 (by Martin Wilz ) * deleting channels works again * fixed savelabel dialog * corrected envelope dialog, string handling * connected many functions via the new string-based way of invocation * fixed some dependencies between old code and new classes (there's still more to do !) * saving should now work again * trimmed down Clipboard class * Color class as wrapper to QColor (may become independent later) * reworking Curve Class for creation via string, interpolation now uses curve objects * moved gui functions into a new library (libkwavegui) * new Classes: Parser DynamicLoader Filter (previously was a struct) * moved gui-independent functions into a library (libkwave) * rework of dialogs into single files and single plugins * new calling scheme via string commands. This will allow scripting and macro definitions. Threading is made a whole lot easier, because a only a string has to be passed and gets expanded into the needed set of parameters in each thread * io functions and playback adapted to SignalManager * Introduction of SignalManager class for multiple channel management 0.29.5 [1998-12-25] (by Martin Wilz ) * Just a fix for an annoying bug while zooming out 0.29.4 [1998-12-22] (by Martin Wilz ) * removed a memory leak in playback * triple-checked the missing Accelerators in the Menumanager. It seems to be a bug in qpopmenu, I'll wait for qt to be fixed, or until a workaround is known * recent Files are updated again, while the program is running * kwave now keeps track of last directory saved to; for user convenience * reestablished selection mechanism to match versions before 0.29.3 and corrected some otherwise screwed-up behavior * _now_ all parameters to destructors should have vanished 0.29.3 [1998-12-18] (by Martin Wilz ) * developement has slowed down a bit, this release is not as complete as I wished but since 0.29.2 has a destructor with parameters accidentally left in, and so does not compile on all systems -> here we go again... * reworked selection routines into a new class, code is still rather confusing, but seems to work * added checkmark functionality again * converted file-menus to new menu-scheme * added gui to mix channels together, the needed functions for mixing are still missing * Halt button by Gerhard Zintel 0.29.2 [1998-12-15] (by Martin Wilz ) * moved clipboard functionality to its own class * dynamic allocation of menu entries used by all classes but TopWidget * import of ascii data files 0.29.1 [1998-12-13] (by Martin Wilz ) * Bugfix for multichannel save. Now the saved files should work with other prgs * local snap to peak by Gerhard Zintel 0.29.0 [1998-11-12] (by Martin Wilz ) * changed version numbering and filename as suggested by Version 1.1 of "How To Name Things" from sunsite. The last digit will always mark be 0 for releases uploaded to ftp.kde.org. * added windowing (Hamming Hanning, Blackmann) functions * contribution from Gerhard Zintel displaying notes in fftview * Added pitch display window * implemented cursor and db scale for fft-view * added reselection and cursor change * added possibility of different display modes in Frequency representation * fixed severe quantization bug in saving 16Bit routine, reported by ? * mmaping support contributed by Juhana Kouhia * added as new Possibility to generate Signals: pulse trains * added wrapper for systems with no posixthreads -> still needs handling by configure script (change Makefile for not linking libpthread and doing a define) * First use of multiple threads (pthreads) in some functions * Pitch generation now independent of additive synthesis * added import function for ascii files * Ascii label saving now also by frequency * Label generation according to Period Detection (autocorellation) * Sonagram, FFTView and Distortion-Dialog now use ScaleWidgets * New ScaleWidget gives the user more information * Improved ProgressDialog and Interpolation class to allow multiple threads * fixed some minor bugs 0.28 [1998-07-15] (by Martin Wilz ) * changes in curvewidget (recent point has another pixmap). * sorting of labels now works without overwriting of QGList::compareItems. * bug fix for saving selection. * save Block function added. * signal finding function in markers.cpp: gui improved. * some smaller bug fixes. 0.27 [1998-07-14] (by Martin Wilz ) * first release, but never uploaded, because ftp.kde.org was down. diff --git a/CMakeLists.txt b/CMakeLists.txt index 70b6c873..b509ab12 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,486 +1,487 @@ ############################################################################# ## Kwave - CMakeLists.txt ## ------------------- ## begin : Tue May 01 2007 ## copyright : (C) 2007 by Thomas Eschenbacher ## email : Thomas.Eschenbacher@gmx.de ############################################################################# # ############################################################################# # # # 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. # # # # For details see the accompanying cmake/COPYING-CMAKE-SCRIPTS file. # # # ############################################################################# ############################################################################# ### project name and version ### PROJECT(kwave) # KDE Application Version, managed by release script set (KDE_APPLICATIONS_VERSION_MAJOR "17") set (KDE_APPLICATIONS_VERSION_MINOR "07") set (KDE_APPLICATIONS_VERSION_MICRO "70") ############################################################################# ### build options: ### # OPTION(DEBUG "build debug code [default=off]" OFF) # OPTION(DEBUG_MEMORY "enable memory management debug code [default=off]" OFF) # OPTION(WITH_ALSA "enable playback/recording via ALSA [default=on]" ON) # OPTION(WITH_DOC "build online documentation [default=on]" ON) # OPTION(WITH_FLAC "enable support for FLAC files [default=on]" ON) # OPTION(WITH_MP3 "enable support for mp3 files [default=off]" OFF) # OPTION(WITH_OGG_OPUS "enable support for ogg/opus files [default=on]" ON) # OPTION(WITH_OGG_VORBIS "enable support for ogg/vorbis files [default=on]" ON) # OPTION(WITH_OSS "enable playback/recording via OSS [default=on]" ON) # OPTION(WITH_OPTIMIZED_MEMCPY "enable optimized memcpy [default=on]" ON) # OPTION(WITH_PULSEAUDIO "enable playback/recording via PulseAudio [default=on]" ON) # OPTION(WITH_QT_AUDIO "enable playback via Qt Multimedia [default=on]" ON) ############################################################################# ### toplevel build targets: ### # all - default target, build all files # clean - clean up the current build directory # deb - create a debian package # doc - generate docbook files for online help # distfiles - generate subdirectory with all files for distribution # html_doc - generate HTML help (for the web) # install - install the package, with support for DESTDIR # msgstats - show the progress of translations # rpm - create a RPM package + a src.rpm file # src_rpm - create the source RPM only # tarball - create a tar.bz2 archive with the sources + specfile # uninstall - uninstall the package, with support for DESTDIR # update-translations - update translation files from KDE SVN # version-labels - update all version numbers and build dates # tarball - create a tar.gz file with the sources ############################################################################# ### required versions ### CMAKE_MINIMUM_REQUIRED(VERSION 2.8.12 FATAL_ERROR) # Honor visibility properties for all target types (since cmake 3.3) IF (POLICY CMP0063) CMAKE_POLICY(SET CMP0063 NEW) ENDIF (POLICY CMP0063) SET(ECM_MIN_VERSION "1.7.0") SET(QT_MIN_VERSION "5.4.0") SET(KF5_MIN_VERSION "5.2.0") ############################################################################# ### path to additional cmake modules and includes ### SET(CMAKE_MODULE_PATH ${CMAKE_SOURCE_DIR}/cmake) ############################################################################# ### Kwave version number ### INCLUDE(FindRequiredProgram) FIND_REQUIRED_PROGRAM(CAT_EXECUTABLE cat) INCLUDE(FindKwaveVersion) ############################################################################# ### show the compiler name and version ### EXECUTE_PROCESS( COMMAND ${CMAKE_C_COMPILER} -dumpversion OUTPUT_VARIABLE COMPILER_VERSION OUTPUT_STRIP_TRAILING_WHITESPACE ) GET_FILENAME_COMPONENT(COMPILER_SHORT "${CMAKE_C_COMPILER}" NAME_WE CACHE) MESSAGE(STATUS "Building with ${COMPILER_SHORT} version ${COMPILER_VERSION}") ############################################################################# ### check for the CPU we build for ### EXECUTE_PROCESS( COMMAND ${CMAKE_C_COMPILER} -dumpmachine OUTPUT_VARIABLE MACHINE OUTPUT_STRIP_TRAILING_WHITESPACE ) MESSAGE(STATUS "Building for target ${MACHINE}") OPTION(WITH_OPTIMIZED_MEMCPY "enable optimized memcpy [default=on]" ON) IF (WITH_OPTIMIZED_MEMCPY) STRING(REGEX MATCH "(i.86-*)|(athlon-*)|(pentium-*)" _mach_x86 ${MACHINE}) IF (_mach_x86) MESSAGE(STATUS "Found target optimized memcpy() for X86 (from xine)") SET(ARCH_X86 1) ENDIF (_mach_x86) STRING(REGEX MATCH "(x86_64-*)|(X86_64-*)|(AMD64-*)|(amd64-*)" _mach_x86_64 ${MACHINE}) IF (_mach_x86_64) MESSAGE(STATUS "Found target optimized memcpy() for X86_64 (from xine)") SET(ARCH_X86_64 1) ENDIF (_mach_x86_64) STRING(REGEX MATCH "(ppc-*)|(powerpc-*)" _mach_ppc ${MACHINE}) IF (_mach_ppc) MESSAGE(STATUS "Found target optimized memcpy() for PPC (from xine)") SET(ARCH_PPC 1) ENDIF (_mach_ppc) IF (NOT ARCH_X86 AND NOT ARCH_X86_64 AND NOT ARCH_PPC) MESSAGE(STATUS "No platform specific memcpy available") ENDIF (NOT ARCH_X86 AND NOT ARCH_X86_64 AND NOT ARCH_PPC) ELSE (WITH_OPTIMIZED_MEMCPY) MESSAGE(STATUS "Platform specific memcpy is disabled") ENDIF (WITH_OPTIMIZED_MEMCPY) ############################################################################# ### cmake includes ### INCLUDE(CheckIncludeFiles) INCLUDE(CheckIncludeFilesCXX) INCLUDE(CheckCCompilerFlag) INCLUDE(CheckCXXCompilerFlag) INCLUDE(CheckTypeSize) INCLUDE(CheckFunctionExists) ############################################################################# ### toplevel compiler flags ### ADD_DEFINITIONS(-DHAVE_CONFIG_H) ADD_DEFINITIONS(-DQT_NO_CAST_TO_ASCII) ADD_DEFINITIONS(-DQT_NO_CAST_FROM_ASCII) ADD_DEFINITIONS(-DQT_USE_FAST_CONCATENATION -DQT_USE_FAST_OPERATOR_PLUS) ADD_DEFINITIONS(-DQT_NO_URL_CAST_FROM_STRING) ADD_DEFINITIONS(-DQT_DEPRECATED_WARNINGS) ADD_DEFINITIONS(-DKXMLGUI_NO_DEPRECATED) CHECK_C_COMPILER_FLAG(" ${CMAKE_SHARED_LIBRARY_C_FLAGS}" C_HAVE_PIC) CHECK_CXX_COMPILER_FLAG(" ${CMAKE_SHARED_LIBRARY_CXX_FLAGS}" CXX_HAVE_PIC) IF (CXX_HAVE_PIC AND C_HAVE_PIC) SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${CMAKE_SHARED_LIBRARY_C_FLAGS}") SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${CMAKE_SHARED_LIBRARY_CXX_FLAGS}") ELSE (CXX_HAVE_PIC AND C_HAVE_PIC) MESSAGE(FATAL_ERROR "shared library support is missing") ENDIF (CXX_HAVE_PIC AND C_HAVE_PIC) CHECK_CXX_COMPILER_FLAG("--std=c++11" CXX_HAVE_CXX11) IF (CXX_HAVE_CXX11) SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} --std=c++11") ENDIF (CXX_HAVE_CXX11) ############################################################################# LINK_DIRECTORIES(${CMAKE_CURRENT_BINARY_DIR}/libgui) LINK_DIRECTORIES(${CMAKE_CURRENT_BINARY_DIR}/libkwave) ############################################################################# ### Qt 5 support ### SET(CMAKE_AUTOMOC TRUE) SET(CMAKE_AUTOMOC_RELAXED_MODE FALSE) FIND_PACKAGE(Qt5 ${QT_MIN_VERSION} CONFIG REQUIRED COMPONENTS Concurrent Core Widgets ) # Qt Multimedia support OPTION(WITH_QT_AUDIO "enable playback via Qt Multimedia [default=on]" ON) IF (WITH_QT_AUDIO) SET(HAVE_QT_AUDIO_SUPPORT on) FIND_PACKAGE(Qt5 ${QT_MIN_VERSION} CONFIG REQUIRED COMPONENTS Multimedia ) ENDIF (WITH_QT_AUDIO) ############################################################################# ### KF5 support ### FIND_PACKAGE(ECM ${ECM_MIN_VERSION} REQUIRED NO_MODULE) SET(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} ${ECM_MODULE_PATH} ${ECM_KDE_MODULE_DIR} ) INCLUDE(KDEInstallDirs) INCLUDE(KDECompilerSettings) INCLUDE(KDECMakeSettings) INCLUDE(GenerateExportHeader) INCLUDE(FeatureSummary) FIND_PACKAGE(KF5 REQUIRED COMPONENTS + Archive Completion Config ConfigWidgets CoreAddons Crash DBusAddons DocTools I18n IconThemes KIO Service TextWidgets XmlGui WidgetsAddons ) IF (NOT WITH_DOC) SET_PACKAGE_PROPERTIES(KF5DocTools PROPERTIES DESCRIPTION "Tools to generate documentation" TYPE OPTIONAL ) ENDIF (NOT WITH_DOC) FEATURE_SUMMARY(WHAT ALL INCLUDE_QUIET_PACKAGES FATAL_ON_MISSING_REQUIRED_PACKAGES) INCLUDE_DIRECTORIES( ${INTERFACE_INCLUDE_DIRECTORIES} ${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_CURRENT_BINARY_DIR} ) ############################################################################# ### checks for needed header files ### CHECK_INCLUDE_FILES(sys/times.h HAVE_SYS_TIMES_H) CHECK_INCLUDE_FILES(signal.h HAVE_SIGNAL_H) SET(_inc_c errno.h limits.h math.h signal.h stdint.h stdio.h stdlib.h string.h sys/types.h unistd.h pthread.h) CHECK_INCLUDE_FILES("${_inc_c}" HAVE_REQUIRED_STD_C_HEADERS) IF (NOT HAVE_REQUIRED_STD_C_HEADERS) MESSAGE(FATAL_ERROR " unable to find one or more of the following C header files: ${_inc_c}") ENDIF (NOT HAVE_REQUIRED_STD_C_HEADERS) SET(_inc_cpp algorithm limits new) CHECK_INCLUDE_FILES_CXX("${_inc_cpp}") ############################################################################# ### checks for some functions ### CHECK_FUNCTION_EXISTS(unlink HAVE_UNLINK) INCLUDE(KwaveSysinfo) ############################################################################# ### libaudiofile and libsamplerate support ### INCLUDE(KwaveLibaudiofileSupport) INCLUDE(KwaveLibsamplerateSupport) ############################################################################# ### optionally: OSS, ALSA and PulseAudio support ### ### for playback/recording ### INCLUDE(KwaveOSSSupport) INCLUDE(KwaveALSASupport) INCLUDE(KwavePulseAudioSupport) ############################################################################# ### cmake includes ### INCLUDE(KwaveL10N) ############################################################################# ### flags for debugging ### OPTION(DEBUG "enable the debug plugin in the menu [default=off]" OFF) IF (DEBUG) SET(HAVE_DEBUG_PLUGIN ON CACHE BOOL "enable debug plugin in the menu") ENDIF (DEBUG) OPTION(DEBUG_MEMORY "enable memory management debug code [default=off]" OFF) ############################################################################# ### subdirs ### ADD_SUBDIRECTORY( libgui ) ADD_SUBDIRECTORY( libkwave ) ADD_SUBDIRECTORY( kwave ) ADD_SUBDIRECTORY( plugins ) OPTION(WITH_DOC "build online documentation [default=on]" ON) IF (WITH_DOC) ADD_SUBDIRECTORY( doc ) ENDIF (WITH_DOC) ############################################################################# ### RPM support ### # directory that receives the files of the "distfiles" target SET(DISTFILES_DIR ${CMAKE_BINARY_DIR}/v${KWAVE_VERSION}) FILE(MAKE_DIRECTORY ${DISTFILES_DIR}) INCLUDE(KwaveRPMSupport) ############################################################################# ### DEB support ### INCLUDE(KwaveDEBSupport) ############################################################################# CONFIGURE_FILE( ${CMAKE_CURRENT_SOURCE_DIR}/config.h.cmake ${CMAKE_CURRENT_BINARY_DIR}/config.h ) ############################################################################# ### KDE .desktop file / mime types ### SET(KWAVE_DESKTOP_MIME_TYPES "${KWAVE_DESKTOP_MIME_TYPES}audio/wav;") SET(KWAVE_DESKTOP_MIME_TYPES "${KWAVE_DESKTOP_MIME_TYPES}audio/x-wav;") SET(KWAVE_DESKTOP_MIME_TYPES "${KWAVE_DESKTOP_MIME_TYPES}audio/basic;") SET(KWAVE_DESKTOP_MIME_TYPES "${KWAVE_DESKTOP_MIME_TYPES}audio/x-8svx;") SET(KWAVE_DESKTOP_MIME_TYPES "${KWAVE_DESKTOP_MIME_TYPES}audio/x-aifc;") SET(KWAVE_DESKTOP_MIME_TYPES "${KWAVE_DESKTOP_MIME_TYPES}audio/x-aiff;") SET(KWAVE_DESKTOP_MIME_TYPES "${KWAVE_DESKTOP_MIME_TYPES}audio/x-avr;") SET(KWAVE_DESKTOP_MIME_TYPES "${KWAVE_DESKTOP_MIME_TYPES}audio/x-caf;") SET(KWAVE_DESKTOP_MIME_TYPES "${KWAVE_DESKTOP_MIME_TYPES}audio/x-ircam;") SET(KWAVE_DESKTOP_MIME_TYPES "${KWAVE_DESKTOP_MIME_TYPES}audio/x-nist;") SET(KWAVE_DESKTOP_MIME_TYPES "${KWAVE_DESKTOP_MIME_TYPES}audio/x-smp;") SET(KWAVE_DESKTOP_MIME_TYPES "${KWAVE_DESKTOP_MIME_TYPES}audio/x-voc;") IF (WITH_MP3) SET(KWAVE_DESKTOP_MIME_TYPES "${KWAVE_DESKTOP_MIME_TYPES}audio/mpeg;") SET(KWAVE_DESKTOP_MIME_TYPES "${KWAVE_DESKTOP_MIME_TYPES}audio/x-mp1;") SET(KWAVE_DESKTOP_MIME_TYPES "${KWAVE_DESKTOP_MIME_TYPES}audio/x-mp2;") SET(KWAVE_DESKTOP_MIME_TYPES "${KWAVE_DESKTOP_MIME_TYPES}audio/x-mp3;") ENDIF (WITH_MP3) IF (WITH_FLAC) SET(KWAVE_DESKTOP_MIME_TYPES "${KWAVE_DESKTOP_MIME_TYPES}application/x-flac;") SET(KWAVE_DESKTOP_MIME_TYPES "${KWAVE_DESKTOP_MIME_TYPES}audio/x-flac;") ENDIF (WITH_FLAC) IF (WITH_OGG_OPUS OR WITH_OGG_VORBIS) SET(KWAVE_DESKTOP_MIME_TYPES "${KWAVE_DESKTOP_MIME_TYPES}audio/ogg;") SET(KWAVE_DESKTOP_MIME_TYPES "${KWAVE_DESKTOP_MIME_TYPES}application/ogg;") ENDIF (WITH_OGG_OPUS OR WITH_OGG_VORBIS) IF (WITH_OGG_VORBIS) SET(KWAVE_DESKTOP_MIME_TYPES "${KWAVE_DESKTOP_MIME_TYPES}audio/x-ogg;") SET(KWAVE_DESKTOP_MIME_TYPES "${KWAVE_DESKTOP_MIME_TYPES}application/x-ogg;") SET(KWAVE_DESKTOP_MIME_TYPES "${KWAVE_DESKTOP_MIME_TYPES}audio/x-vorbis+ogg;") ENDIF (WITH_OGG_VORBIS) IF (WITH_OGG_OPUS) SET(KWAVE_DESKTOP_MIME_TYPES "${KWAVE_DESKTOP_MIME_TYPES}audio/opus;") ENDIF (WITH_OGG_OPUS) CONFIGURE_FILE( ${CMAKE_CURRENT_SOURCE_DIR}/kwave/org.kde.kwave.desktop.in ${CMAKE_CURRENT_BINARY_DIR}/kwave/org.kde.kwave.desktop ) ############################################################################# ### Gentoo support ### INCLUDE(KwaveEbuild) ############################################################################# ### collection of all files used for distribution ### FIND_PROGRAM(SED_EXECUTABLE NAMES sed) SET(_distfiles_md5sum ${DISTFILES_DIR}/MD5SUMS-${KWAVE_VERSION}) ADD_CUSTOM_COMMAND(OUTPUT ${_distfiles_md5sum} COMMAND md5sum ${KWAVE_DISTFILES} | ${SED_EXECUTABLE} s+${DISTFILES_DIR}/++g > ${_distfiles_md5sum} DEPENDS ${KWAVE_DISTFILES} ) ADD_CUSTOM_TARGET(distfiles DEPENDS ${KWAVE_DISTFILES} ${_distfiles_md5sum} ) ############################################################################# ### uninstall support ### FIND_REQUIRED_PROGRAM(RMDIR_EXECUTABLE rmdir) CONFIGURE_FILE( ${CMAKE_CURRENT_SOURCE_DIR}/cmake/uninstall.cmake.in ${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake @ONLY ) ############################################################################# ### "make apidoc" ### FIND_PROGRAM(RM_EXECUTABLE rm) FIND_PROGRAM(DOXYGEN_EXECUTABLE doxygen) IF (DOXYGEN_EXECUTABLE AND RM_EXECUTABLE) SET(DOXYFILE ${CMAKE_CURRENT_BINARY_DIR}/Doxyfile) SET(DOXYGEN_OUTPUT_DIR ${CMAKE_BINARY_DIR}/doc/api) SET(DOXYGEN_LOGFILE ${CMAKE_CURRENT_BINARY_DIR}/doxygen.log) MESSAGE(STATUS "Found doxygen: ${DOXYGEN_EXECUTABLE}") CONFIGURE_FILE( ${CMAKE_CURRENT_SOURCE_DIR}/doxy.cfg.in ${DOXYFILE} @ONLY ) ADD_CUSTOM_TARGET(apidoc DEPENDS html_doc_devel COMMAND "${RM_EXECUTABLE}" -R -f "${CMAKE_BINARY_DIR}/doc/api" COMMAND "${CMAKE_COMMAND}" -E make_directory "${CMAKE_BINARY_DIR}/doc/api" COMMAND "${DOXYGEN_EXECUTABLE}" "${DOXYFILE}" COMMAND "${CAT_EXECUTABLE}" "${DOXYGEN_LOGFILE}" DEPENDS ${DOXYFILE} ) SET(KWAVE_ADDITIONAL_CLEAN_FILES ${KWAVE_ADDITIONAL_CLEAN_FILES} ${DOXYGEN_OUTPUT_DIR} ${DOXYGEN_LOGFILE} ) ENDIF (DOXYGEN_EXECUTABLE AND RM_EXECUTABLE) ############################################################################# ### additional files for "make clean" ### IF (KWAVE_ADDITIONAL_CLEAN_FILES) SET_DIRECTORY_PROPERTIES(PROPERTIES ADDITIONAL_MAKE_CLEAN_FILES "${KWAVE_ADDITIONAL_CLEAN_FILES}" ) ENDIF (KWAVE_ADDITIONAL_CLEAN_FILES) ############################################################################# ### "make wrapper" ### ### -> creates a wrapper script named "kw" ### SET(WRAPPER_SCRIPT "${CMAKE_CURRENT_BINARY_DIR}/kw") CONFIGURE_FILE( "${CMAKE_CURRENT_SOURCE_DIR}/bin/kwave.wrapper.in" "${WRAPPER_SCRIPT}" @ONLY ) ADD_CUSTOM_TARGET(wrapper COMMAND chmod +rx "${WRAPPER_SCRIPT}" DEPENDS "${WRAPPER_SCRIPT}" ) ############################################################################# MESSAGE(STATUS "Using CFLAGS=${CMAKE_C_FLAGS}") MESSAGE(STATUS "Using CXXFLAGS=${CMAKE_CXX_FLAGS}") MESSAGE(STATUS "Using LDFLAGS=${LDFLAGS}") ############################################################################# ############################################################################# diff --git a/LICENSES b/LICENSES index c20a07ac..56bda8a6 100644 --- a/LICENSES +++ b/LICENSES @@ -1,870 +1,882 @@ here the results of a licensing investigation (first done 2007-06-17) LIST OF LICENSES FOUND IN THE SOURCES ===================================== * GPL2 - GNU General Public License, version 2 or newer (abbreviated as GPL2+) - kwave, libgui, libkwave and many others... => this currently is the Kwave "default" license ! => the intention of the authors is to keep Kwave under the GPL2+ * LGPL2 - GNU Library General Public License, version 2 or newer - some icons * Creative Commons Attribution-Share Alike 3.0 License or the GNU Library General Public License 3.0 - Oxygen icons * Creative Commons Attribution-Share Alike 3.0 (CC BY-SA 3.0) http://creativecommons.org/licenses/by-sa/3.0/ - audio samples in samples/... * Creative Commons Zero v1.0 Universal (CC0-1.0) - kwave/kwave.appdata.xml * Kitware (cmake) - cmake/Copyright.txt * FDL - Free Documentation License - documentation in doc - screenshots * BSD - cmake/COPYING-CMAKE-SCRIPTS BSD (3 clause) - plugins/codec_ogg/OpusEncoder.cpp BSD (3 clause) DIRECTLY USED EXTERNAL LIBRARIES ================================ * Qt-5 GPL2 or GPL3 * KDE frameworks 5 LGPL2 * FFTW-3.x GPL2+ * audiofile-0.2.6 LGPL2+ / GPL2+ * id3lib-3.8.3 LGPL2.1 * mad-0.15.1b GPL2+ <= possible patent issue !!! * ogg-1.1.3 ~BSD style * flac-1.2.1 Xiph.Org's BSD-like + GPL2 + LGPL2 * alsa-lib-1.0.16 LGPL2.1 * OSS-3.8 GPL2, CDDL, BSD * libstdc++-v3.3.6 LGPL2.1 * glibc-2.6.1 LGPL2 * libsamplerate-0.1.4 GPL2+ * pulseaudio-4.0 LGPL2.1+ LICENSE ISSUES ============== issue #1: license of the icons ------------------------------ -> maybe most are LGPL, but might depend from case to case !!! (the icons listed here are composed of one or more icons from KDE and/or modified) # doc/en/audio-1.png ??? UNKNOWN ??? -> kdeclassic/32x32/apps/kblackbox.png + kdeclassic/64x64/mimetypes/binary2.png + kdeclassic/32x32/apps/kmix.png + kdeclassic/32x32/actions/forward.png + ??? + ??? # doc/en/audio2signal.png ??? UNKNOWN ??? -> kdeclassic/32x32/apps/kmix.png + kdeclassic/32x32/actions/forward.png + ??? + ??? # doc/en/nonlinear.png ??? UNKNOWN ??? (arrow only) -> arrow is from kdeclassic/32x32/actions/forward.png issue #2: license of some files is unknown or problematic / author known ------------------------------------------------------------------------ - currently none - issue #3: some files have neither license nor author ---------------------------------------------------- - currently none - COMPLETE LIST OF FILES AND THEIR LICENSE ======================================== AUTHORS GPL2+ CHANGES (should be GPL2+) CMakeLists.txt BSD (3 clause) config.h.cmake GPL2+ doxy.cfg.in GPL2+ ExtraDesktop.sh GPL2+ GNU-LICENSE free kwave.ebuild.in GPL2+ / Gentoo kwave.kdev4 GPL2+ kwave.spec.in GPL2+ LICENSES GPL2+ Messages.sh GPL2+ README GPL2+ TODO GPL2+ VERSION GPL2+ .krazy GPL2+ bin/import-screenshots.sh GPL2+ bin/make-specfile-changelog.pl GPL2+ bin/menusconfig2pot.pl GPL2+ bin/msgstats.pl GPL2+ bin/svn-update-l10n.sh GPL2+ bin/update-command-xref.pl GPL2+ bin/update-fileinfo-xref.pl GPL2+ bin/update-plugin-xref.pl GPL2+ cmake/CheckIncludeFilesCXX.cmake BSD (3 clause) cmake/COPYING-CMAKE-SCRIPTS BSD (3 clause) cmake/Copyright.txt Kitware (cmake) cmake/FindKwaveVersion.cmake BSD (3 clause) cmake/FindRequiredProgram.cmake BSD (3 clause) cmake/KwaveALSASupport.cmake BSD (3 clause) cmake/KwaveDEBSupport.cmake BSD (3 clause) cmake/KwaveEbuild.cmake BSD (3 clause) cmake/KwaveHandbook.cmake BSD (3 clause) cmake/KwaveL10N.cmake BSD (3 clause) cmake/KwaveLibaudiofileSupport.cmake BSD (3 clause) cmake/KwaveLibsamplerateSupport.cmake BSD (3 clause) cmake/KwaveOSSSupport.cmake BSD (3 clause) cmake/KwavePulseAudioSupport.cmake BSD (3 clause) cmake/KwaveRPMSupport.cmake BSD (3 clause) cmake/KwaveSysinfo.cmake BSD (3 clause) cmake/uninstall.cmake.in BSD (3 clause) doc/CMakeLists.txt BSD (3 clause) doc/fix-common GPL2+ doc/en/CMakeLists.txt BSD (3 clause) doc/en/README.translators.txt GPL2+ # doc/en/audio-1.png ??? UNKNOWN ??? # doc/en/audio2signal.png ??? UNKNOWN ??? doc/en/krec_record.png LGPL2 (crystal project) [copied from mix_record.png] doc/en/kwave-edit-label.png (should be FDL) doc/en/kwave-gui-mdi.png (should be FDL) doc/en/kwave-gui-sdi.png (should be FDL) doc/en/kwave-gui-tab.png (should be FDL) doc/en/kwave-main.png (should be FDL) doc/en/kwave-plugin-about.png (should be FDL) doc/en/kwave-plugin-amplifyfree.png (should be FDL) doc/en/kwave-plugin-band_pass.png (should be FDL) doc/en/kwave-plugin-codec_mp3.png (should be FDL) doc/en/kwave-plugin-fileinfo.png (should be FDL) doc/en/kwave-plugin-goto.png (should be FDL) doc/en/kwave-plugin-insert_at.png (should be FDL) doc/en/kwave-plugin-lowpass.png (should be FDL) doc/en/kwave-plugin-memory.png (should be FDL) doc/en/kwave-plugin-newsignal.png (should be FDL) doc/en/kwave-plugin-noise.png (should be FDL) doc/en/kwave-plugin-notch_filter.png (should be FDL) doc/en/kwave-plugin-pitch_shift.png (should be FDL) doc/en/kwave-plugin-playback.png (should be FDL) doc/en/kwave-plugin-record.png (should be FDL) doc/en/kwave-plugin-saveblocks.png (should be FDL) doc/en/kwave-plugin-selectrange.png (should be FDL) doc/en/kwave-plugin-sonagram-setup.png (should be FDL) doc/en/kwave-plugin-sonagram-window.png (should be FDL) doc/en/kwave-plugin-stringenter.png (should be FDL) doc/en/kwave-plugin-volume.png (should be FDL) doc/en/light_off.png LGPL2 (crystal project) [derived from greenled.png] doc/en/light_on.png LGPL2 (crystal project) [derived from greenled.png] # doc/en/nonlinear.png ??? UNKNOWN ??? (arrow only) doc/en/record_new.png LGPL2 (crystal project) [copied from document-new.png] doc/en/record_pause.png (should be FDL) doc/en/record_stop.png (should be FDL) doc/en/signal2digital.png (should be FDL) doc/en/signed.png (should be FDL) doc/en/sinus2samples.png (should be FDL) doc/en/under-construction.png LGPL2 (crystal project) [copied from Service\ Manager.png] doc/en/unsigned.png (should be FDL) kwave/CMakeLists.txt BSD (3 clause) kwave/App.cpp GPL2+ kwave/App.h GPL2+ kwave/FileContext.cpp GPL2+ kwave/FileContext.h GPL2+ kwave/kwave.appdata.xml CC0-1.0 kwave/main.cpp GPL2+ / Martin Wilz kwave/MainWidget.cpp GPL2+ / Martin Wilz kwave/MainWidget.h GPL2+ / Martin Wilz kwave/menus.config GPL2+ kwave/org.kde.kwave.desktop.in (should be GPL2+) kwave/ShortcutWrapper.cpp GPL2+ kwave/ShortcutWrapper.h GPL2+ kwave/Splash.cpp GPL2+ / Gilles Caulier kwave/Splash.h GPL2+ / Gilles Caulier kwave/PlayerToolBar.cpp GPL2+ kwave/PlayerToolBar.h GPL2+ kwave/TopWidget.cpp GPL2+ / Martin Wilz kwave/TopWidget.h GPL2+ / Martin Wilz kwave/ZoomToolBar.cpp GPL2+ kwave/ZoomToolBar.h GPL2+ kwave/pics/amplify_free.png (should be GPL2+) kwave/pics/fade_in.png (should be GPL2+) kwave/pics/fade_out.png (should be GPL2+) kwave/pics/knob.xpm LGPL2 (crystal project) [derived from greenled.png] kwave/pics/kwave-splash.png (should be GPL2+ / Thomas Eschenbacher) kwave/pics/kwave.svgz (should be GPL2+ / Thomas Eschenbacher) kwave/pics/krec_record.xpm LGPL2 (crystal project) [converted from mix_record.png] kwave/pics/light_off.xpm LGPL2 (crystal project) [derived from greenled.png] kwave/pics/light_on.xpm LGPL2 (crystal project) [copied from greenled.png] kwave/pics/logo.xpm (should be GPL2+ / Martin Wilz) kwave/pics/noise.png (should be GPL2+) kwave/pics/selectedknob.xpm LGPL2 (crystal project) [derived from greenled.png] kwave/pics/sound_card.png LGPL2 (crystal project) [copied from kcmpci.png] kwave/pics/sound_device.png LGPL2 (crystal project) [copied from multimedia.png] kwave/pics/sound_note.png LGPL2 (crystal project) [copied from knotify.png] kwave/pics/sound_subdevice.png LGPL2 (crystal project) [copied from kcmsound.png] kwave/toolbar/kwave_player_bg.svgz derived from "Oxygen" icons kwave/toolbar/kwave_player_end.svgz derived from "Oxygen" icons kwave/toolbar/kwave_player_fwd.svgz derived from "Oxygen" icons kwave/toolbar/kwave_player_loop.svgz derived from "Oxygen" icons kwave/toolbar/kwave_player_pause.svgz derived from "Oxygen" icons kwave/toolbar/kwave_player_pause_2.svgz derived from "Oxygen" icons kwave/toolbar/kwave_player_play.svgz derived from "Oxygen" icons kwave/toolbar/kwave_player_record.svgz derived from "Oxygen" icons kwave/toolbar/kwave_player_rew.svgz derived from "Oxygen" icons kwave/toolbar/kwave_player_start.svgz derived from "Oxygen" icons kwave/toolbar/kwave_player_stop.svgz derived from "Oxygen" icons kwave/toolbar/kwave_viewmag.svgz derived from "Oxygen" icons kwave/toolbar/kwave_viewmagfit.svgz derived from "Oxygen" icons kwave/toolbar/kwave_zoom_in.svgz derived from "Oxygen" icons kwave/toolbar/kwave_zoom_original.svgz derived from "Oxygen" icons kwave/toolbar/kwave_zoom_out.svgz derived from "Oxygen" icons libgui/CMakeLists.txt BSD (3 clause) libgui/Colors.cpp GPL2+ libgui/Colors.h GPL2+ libgui/ConfirmCancelProxy.cpp GPL2+ libgui/ConfirmCancelProxy.h GPL2+ libgui/CurveWidget.cpp GPL2+ libgui/CurveWidget.h GPL2+ libgui/FileDialog.cpp GPL2+ libgui/FileDialog.h GPL2+ libgui/FilterPlugin.cpp GPL2+ libgui/FilterPlugin.h GPL2+ libgui/FrequencyResponseWidget.cpp GPL2+ libgui/FrequencyResponseWidget.h GPL2+ libgui/HMSTimeWidgetBase.ui (should be GPL2+) libgui/HMSTimeWidget.cpp GPL2+ libgui/HMSTimeWidget.h GPL2+ libgui/ImageView.cpp GPL2+ / Martin Wilz libgui/ImageView.h GPL2+ / Martin Wilz libgui/InvertableSpinBox.cpp GPL2+ libgui/InvertableSpinBox.h GPL2+ libgui/LabelItem.cpp GPL2+ libgui/LabelItem.h GPL2+ libgui/LabelPropertiesWidget.cpp GPL2+ libgui/LabelPropertiesWidget.h GPL2+ libgui/LabelPropertiesWidgetBase.ui GPL2+ libgui/MenuGroup.cpp GPL2+ libgui/MenuGroup.h GPL2+ libgui/MenuItem.cpp GPL2+ libgui/MenuItem.h GPL2+ libgui/MenuManager.cpp GPL2+ libgui/MenuManager.h GPL2+ libgui/MenuNode.cpp GPL2+ libgui/MenuNode.h GPL2+ libgui/MenuRoot.cpp GPL2+ libgui/MenuRoot.h GPL2+ libgui/MenuSub.cpp GPL2+ libgui/MenuSub.h GPL2+ libgui/MouseMark.cpp GPL2+ libgui/MouseMark.h GPL2+ libgui/MultiStateWidget.cpp GPL2+ libgui/MultiStateWidget.h GPL2+ libgui/OverViewCache.cpp GPL2+ libgui/OverViewCache.h GPL2+ libgui/OverViewWidget.cpp GPL2+ libgui/OverViewWidget.h GPL2+ libgui/ScaleWidget.cpp GPL2+ libgui/ScaleWidget.h GPL2+ libgui/SelectionBorderItem.h GPL2+ libgui/SelectionBorderItem.cpp GPL2+ libgui/SelectionItem.h GPL2+ libgui/SelectionItem.cpp GPL2+ libgui/SelectionTracker.h GPL2+ libgui/SelectionTracker.cpp GPL2+ libgui/SelectTimeWidgetBase.ui (should be GPL2+) libgui/SelectTimeWidget.cpp GPL2+ libgui/SelectTimeWidget.h GPL2+ libgui/SignalWidget.cpp GPL2+ / Martin Wilz libgui/SignalWidget.h GPL2+ libgui/TrackPixmap.cpp GPL2+ libgui/TrackPixmap.h GPL2+ libgui/TrackView.cpp GPL2+ libgui/TrackView.h GPL2+ libgui/TreeWidgetWrapper.cpp GPL2+ libgui/TreeWidgetWrapper.h GPL2+ libgui/UndoModifyLabelAction.cpp GPL2+ libgui/UndoModifyLabelAction.h GPL2+ libgui/ViewItem.cpp GPL2+ libgui/ViewItem.h GPL2+ libgui/Zoomable.h GPL2+ libkwave/BitrateMode.h GPL2+ libkwave/ByteOrder.h GPL2+ libkwave/ClipBoard.cpp GPL2+ libkwave/ClipBoard.h GPL2+ libkwave/CMakeLists.txt BSD (3 clause) libkwave/CodecBase.cpp GPL2+ libkwave/CodecBase.h GPL2+ libkwave/CodecManager.cpp GPL2+ libkwave/CodecManager.h GPL2+ libkwave/CodecPlugin.cpp GPL2+ libkwave/CodecPlugin.h GPL2+ libkwave/CommandHandler.h GPL2+ libkwave/Compression.cpp GPL2+ libkwave/Compression.h GPL2+ libkwave/Connect.cpp GPL2+ libkwave/Connect.h GPL2+ libkwave/cpu_accel.cpp GPL2+ / Aaron Holtzman libkwave/cputest.h GPL2+ libkwave/Curve.cpp GPL2+ libkwave/Curve.h GPL2+ libkwave/Decoder.cpp GPL2+ libkwave/Decoder.h GPL2+ libkwave/Drag.cpp GPL2+ libkwave/Drag.h GPL2+ libkwave/Encoder.cpp GPL2+ libkwave/Encoder.h GPL2+ libkwave/FileDrag.h GPL2+ libkwave/FileInfo.cpp GPL2+ libkwave/FileInfo.h GPL2+ libkwave/FileProgress.cpp GPL2+ libkwave/FileProgress.h GPL2+ libkwave/Filter.cpp GPL2+ libkwave/Filter.h GPL2+ libkwave/FixedPool.h GPL2+ libkwave/Functions.cpp GPL2+ libkwave/Functions.h GPL2+ libkwave/GenreType.cpp GPL2+ libkwave/GenreType.h GPL2+ libkwave/GlobalLock.cpp GPL2+ libkwave/GlobalLock.h GPL2+ libkwave/InsertMode.h GPL2+ libkwave/Interpolation.cpp GPL2+ libkwave/Interpolation.h GPL2+ libkwave/Label.cpp GPL2+ libkwave/Label.h GPL2+ libkwave/LabelList.cpp GPL2+ libkwave/LabelList.h GPL2+ libkwave/Logger.cpp GPL2+ libkwave/Logger.h GPL2+ libkwave/Matrix.h GPL2+ (Martin Hinsch) libkwave/MimeData.cpp GPL2+ libkwave/MimeData.h GPL2+ libkwave/MixerMatrix.cpp GPL2+ libkwave/MixerMatrix.h GPL2+ libkwave/memcpy.c GPL2+ / xine libkwave/memcpy.h GPL2+ libkwave/MemoryManager.cpp GPL2+ libkwave/MemoryManager.h GPL2+ libkwave/MessageBox.h GPL2+ libkwave/MessageBox.cpp GPL2+ libkwave/MetaData.cpp GPL2+ libkwave/MetaData.h GPL2+ libkwave/MetaDataList.cpp GPL2+ libkwave/MetaDataList.h GPL2+ libkwave/MultiPlaybackSink.cpp GPL2+ libkwave/MultiPlaybackSink.h GPL2+ libkwave/MultiStreamWriter.cpp GPL2+ libkwave/MultiStreamWriter.h GPL2+ libkwave/MultiTrackSource.h GPL2+ libkwave/MultiTrackReader.cpp GPL2+ libkwave/MultiTrackReader.h GPL2+ libkwave/MultiTrackSink.h GPL2+ libkwave/MultiTrackWriter.cpp GPL2+ libkwave/MultiTrackWriter.h GPL2+ libkwave/MultiWriter.cpp GPL2+ libkwave/MultiWriter.h GPL2+ libkwave/Parser.cpp GPL2+ libkwave/Parser.h GPL2+ libkwave/PlaybackController.cpp GPL2+ libkwave/PlaybackController.h GPL2+ libkwave/PlaybackDeviceFactory.h GPL2+ libkwave/PlayBackDevice.h GPL2+ libkwave/PlayBackParam.h GPL2+ libkwave/PlaybackSink.cpp GPL2+ libkwave/PlaybackSink.h GPL2+ libkwave/PlayBackTypesMap.cpp GPL2+ libkwave/PlayBackTypesMap.h GPL2+ libkwave/Plugin.cpp GPL2+ libkwave/Plugin.h GPL2+ libkwave/PluginManager.cpp GPL2+ libkwave/PluginManager.h GPL2+ libkwave/PluginSetupDialog.h GPL2+ libkwave/ReaderMode.h GPL2+ libkwave/Runnable.h GPL2+ libkwave/Sample.h GPL2+ libkwave/SampleArray.cpp GPL2+ libkwave/SampleArray.h GPL2+ libkwave/SampleEncoder.h GPL2+ libkwave/SampleEncoderLinear.h GPL2+ libkwave/SampleEncoderLinear.cpp GPL2+ libkwave/SampleFIFO.cpp GPL2+ libkwave/SampleFIFO.h GPL2+ libkwave/SampleFormat.cpp GPL2+ libkwave/SampleFormat.h GPL2+ libkwave/SampleReader.cpp GPL2+ libkwave/SampleReader.h GPL2+ libkwave/SampleSink.cpp GPL2+ libkwave/SampleSink.h GPL2+ libkwave/SampleSource.cpp GPL2+ libkwave/SampleSource.h GPL2+ libkwave/Selection.h GPL2+ libkwave/Selection.cpp GPL2+ libkwave/Signal.cpp GPL2+ libkwave/Signal.h GPL2+ libkwave/SignalManager.cpp GPL2+ libkwave/SignalManager.h GPL2+ libkwave/StandardBitrates.cpp GPL2+ libkwave/StandardBitrates.h GPL2+ libkwave/StreamWriter.cpp GPL2+ libkwave/StreamWriter.h GPL2+ libkwave/String.h GPL2+ libkwave/Stripe.cpp GPL2+ libkwave/Stripe.h GPL2+ libkwave/SwapFile.cpp GPL2+ libkwave/SwapFile.h GPL2+ libkwave/Track.cpp GPL2+ libkwave/Track.h GPL2+ libkwave/TrackWriter.cpp GPL2+ libkwave/TrackWriter.h GPL2+ libkwave/TransmissionFunction.h GPL2+ libkwave/Triple.h GPL2+ libkwave/TypesMap.h GPL2+ libkwave/Utils.h GPL2+ libkwave/Utils.cpp GPL2+ libkwave/VirtualAudioFile.cpp GPL2+ libkwave/VirtualAudioFile.h GPL2+ libkwave/VorbisCommentMap.cpp GPL2+ libkwave/VorbisCommentMap.h GPL2+ libkwave/WindowFunction.cpp GPL2+ libkwave/WindowFunction.h GPL2+ libkwave/WorkerThread.h GPL2+ libkwave/WorkerThread.cpp GPL2+ libkwave/Writer.cpp GPL2+ libkwave/Writer.h GPL2+ libkwave/modules/ChannelMixer.cpp GPL2+ libkwave/modules/ChannelMixer.h GPL2+ libkwave/modules/CurveStreamAdapter.cpp GPL2+ libkwave/modules/CurveStreamAdapter.h GPL2+ libkwave/modules/Delay.cpp GPL2+ libkwave/modules/Delay.h GPL2+ libkwave/modules/Indexer.cpp GPL2+ libkwave/modules/Indexer.h GPL2+ libkwave/modules/Mul.cpp GPL2+ libkwave/modules/Mul.h GPL2+ libkwave/modules/Osc.cpp GPL2+ libkwave/modules/Osc.h GPL2+ libkwave/modules/SampleBuffer.cpp GPL2+ libkwave/modules/SampleBuffer.h GPL2+ libkwave/modules/StreamObject.cpp GPL2+ libkwave/modules/StreamObject.h GPL2+ libkwave/undo/UndoAction.h GPL2+ libkwave/undo/UndoAddMetaDataAction.cpp GPL2+ libkwave/undo/UndoAddMetaDataAction.h GPL2+ libkwave/undo/UndoDeleteAction.cpp GPL2+ libkwave/undo/UndoDeleteAction.h GPL2+ libkwave/undo/UndoDeleteMetaDataAction.cpp GPL2+ libkwave/undo/UndoDeleteMetaDataAction.h GPL2+ libkwave/undo/UndoDeleteTrack.cpp GPL2+ libkwave/undo/UndoDeleteTrack.h GPL2+ libkwave/undo/UndoHandler.h GPL2+ libkwave/undo/UndoInsertAction.cpp GPL2+ libkwave/undo/UndoInsertAction.h GPL2+ libkwave/undo/UndoInsertTrack.cpp GPL2+ libkwave/undo/UndoInsertTrack.h GPL2+ libkwave/undo/UndoManager.cpp GPL2+ libkwave/undo/UndoManager.h GPL2+ libkwave/undo/UndoModifyAction.cpp GPL2+ libkwave/undo/UndoModifyAction.h GPL2+ libkwave/undo/UndoModifyMetaDataAction.cpp GPL2+ libkwave/undo/UndoModifyMetaDataAction.h GPL2+ libkwave/undo/UndoSelection.cpp GPL2+ libkwave/undo/UndoSelection.h GPL2+ libkwave/undo/UndoTransaction.cpp GPL2+ libkwave/undo/UndoTransactionGuard.cpp GPL2+ libkwave/undo/UndoTransactionGuard.h GPL2+ libkwave/undo/UndoTransaction.h GPL2+ plugins/CMakeLists.txt BSD (3 clause) plugins/kwave-plugin.desktop GPL2+ plugins/about/AboutContainer.cpp GPL2+ / Mirko Boehm / Espen Sand plugins/about/AboutContainer.h GPL2+ / Mirko Boehm / Espen Sand plugins/about/AboutDialogBase.ui (should be GPL2+ / Ralf Waspe) plugins/about/AboutDialog.cpp GPL2+ / Ralf Waspe & Gilles Caulier plugins/about/AboutDialog.h GPL2+ / Ralf Waspe plugins/about/AboutPlugin.cpp GPL2+ plugins/about/AboutPlugin.h GPL2+ plugins/about/CMakeLists.txt BSD (3 clause) plugins/about/kwaveplugin_about.desktop.in GPL2+ plugins/about/LogoWidget.cpp GPL2+ / Martin Wilz plugins/about/LogoWidget.h GPL2+ / Martin Wilz plugins/about/logo.xpm GPL2+ / Martin Wilz plugins/amplifyfree/AmplifyFreeDialog.cpp GPL2+ plugins/amplifyfree/AmplifyFreeDialog.h GPL2+ plugins/amplifyfree/AmplifyFreeDlg.ui (should be GPL2+) plugins/amplifyfree/AmplifyFreePlugin.cpp GPL2+ plugins/amplifyfree/AmplifyFreePlugin.h GPL2+ plugins/amplifyfree/CMakeLists.txt BSD (3 clause) plugins/amplifyfree/kwaveplugin_amplifyfree.desktop.in GPL2+ plugins/band_pass/BandPass.cpp GPL2+ / Juhana Sadeharju plugins/band_pass/BandPass.h GPL2+ plugins/band_pass/BandPassDialog.cpp GPL2+ plugins/band_pass/BandPassDialog.h GPL2+ plugins/band_pass/BandPassDlg.ui GPL2+ plugins/band_pass/BandPass.h GPL2+ plugins/band_pass/BandPassPlugin.cpp GPL2+ plugins/band_pass/BandPassPlugin.h GPL2+ plugins/band_pass/CMakeLists.txt BSD (3 clause) plugins/band_pass/kwaveplugin_band_pass.desktop.in GPL2+ plugins/codec_ascii/AsciiCodecPlugin.cpp GPL2+ plugins/codec_ascii/AsciiCodecPlugin.h GPL2+ plugins/codec_ascii/AsciiEncoder.h GPL2+ plugins/codec_ascii/AsciiDecoder.h GPL2+ plugins/codec_ascii/AsciiEncoder.cpp GPL2+ plugins/codec_ascii/AsciiDecoder.cpp GPL2+ plugins/codec_ascii/CMakeLists.txt BSD (3 clause) plugins/codec_ascii/kwaveplugin_codec_ascii.desktop.in GPL2+ plugins/codec_audiofile/AudiofileCodecPlugin.cpp GPL2+ plugins/codec_audiofile/AudiofileCodecPlugin.h GPL2+ plugins/codec_audiofile/AudiofileDecoder.cpp GPL2+ plugins/codec_audiofile/AudiofileDecoder.h GPL2+ plugins/codec_audiofile/CMakeLists.txt BSD (3 clause) plugins/codec_audiofile/kwaveplugin_codec_audiofile.desktop.in GPL2+ plugins/codec_flac/CMakeLists.txt BSD (3 clause) plugins/codec_flac/FlacCodecPlugin.cpp GPL2+ plugins/codec_flac/FlacCodecPlugin.h GPL2+ plugins/codec_flac/FlacDecoder.cpp GPL2+ plugins/codec_flac/FlacDecoder.h GPL2+ plugins/codec_flac/FlacEncoder.cpp GPL2+ plugins/codec_flac/FlacEncoder.h GPL2+ plugins/codec_flac/kwaveplugin_codec_flac.desktop.in GPL2+ plugins/codec_mp3/CMakeLists.txt BSD (3 clause) plugins/codec_mp3/ID3_PropertyMap.cpp GPL2+ plugins/codec_mp3/ID3_PropertyMap.h GPL2+ plugins/codec_mp3/ID3_QIODeviceReader.cpp GPL2+ plugins/codec_mp3/ID3_QIODeviceReader.h GPL2+ plugins/codec_mp3/ID3_QIODeviceWriter.cpp GPL2+ plugins/codec_mp3/ID3_QIODeviceWriter.h GPL2+ plugins/codec_mp3/kwaveplugin_codec_mp3.desktop.in GPL2+ plugins/codec_mp3/MP3CodecPlugin.cpp GPL2+ plugins/codec_mp3/MP3CodecPlugin.h GPL2+ plugins/codec_mp3/MP3Decoder.cpp GPL2+ plugins/codec_mp3/MP3Decoder.h GPL2+ plugins/codec_mp3/MP3Encoder.cpp GPL2+ plugins/codec_mp3/MP3Encoder.h GPL2+ plugins/codec_ogg/CMakeLists.txt BSD (3 clause) plugins/codec_ogg/kwaveplugin_codec_ogg.desktop.in GPL2+ plugins/codec_ogg/OggCodecPlugin.cpp GPL2+ plugins/codec_ogg/OggCodecPlugin.h GPL2+ plugins/codec_ogg/OggDecoder.cpp GPL2+ plugins/codec_ogg/OggDecoder.h GPL2+ plugins/codec_ogg/OggEncoder.cpp GPL2+ plugins/codec_ogg/OggEncoder.h GPL2+ plugins/codec_ogg/OggSubDecoder.h GPL2+ plugins/codec_ogg/OggSubEncoder.h GPL2+ plugins/codec_ogg/OpusCommon.cpp GPL2+ plugins/codec_ogg/OpusCommon.h GPL2+ plugins/codec_ogg/OpusDecoder.cpp GPL2+ plugins/codec_ogg/OpusDecoder.h GPL2+ plugins/codec_ogg/OpusEncoder.cpp GPL2+, parts two clause BSD plugins/codec_ogg/OpusEncoder.h GPL2+ plugins/codec_ogg/OpusHeader.h GPL2+ plugins/codec_ogg/VorbisDecoder.cpp GPL2+ plugins/codec_ogg/VorbisDecoder.h GPL2+ plugins/codec_ogg/VorbisEncoder.cpp GPL2+ plugins/codec_ogg/VorbisEncoder.h GPL2+ plugins/codec_wav/CMakeLists.txt BSD (3 clause) plugins/codec_wav/kwaveplugin_codec_wav.desktop.in GPL2+ plugins/codec_wav/RecoveryBuffer.cpp GPL2+ plugins/codec_wav/RecoveryBuffer.h GPL2+ plugins/codec_wav/RecoveryMapping.cpp GPL2+ plugins/codec_wav/RecoveryMapping.h GPL2+ plugins/codec_wav/RecoverySource.cpp GPL2+ plugins/codec_wav/RecoverySource.h GPL2+ plugins/codec_wav/RepairVirtualAudioFile.cpp GPL2+ plugins/codec_wav/RepairVirtualAudioFile.h GPL2+ plugins/codec_wav/RIFFChunk.cpp GPL2+ plugins/codec_wav/RIFFChunk.h GPL2+ plugins/codec_wav/RIFFParser.cpp GPL2+ plugins/codec_wav/RIFFParser.h GPL2+ plugins/codec_wav/WavCodecPlugin.cpp GPL2+ plugins/codec_wav/WavCodecPlugin.h GPL2+ plugins/codec_wav/WavDecoder.cpp GPL2+ plugins/codec_wav/WavDecoder.h GPL2+ plugins/codec_wav/WavEncoder.cpp GPL2+ plugins/codec_wav/WavEncoder.h GPL2+ plugins/codec_wav/WavFileFormat.h GPL2+ plugins/codec_wav/WavFormatMap.cpp GPL2+ plugins/codec_wav/WavFormatMap.h GPL2+ plugins/codec_wav/WavPropertyMap.cpp GPL2+ plugins/codec_wav/WavPropertyMap.h GPL2+ plugins/common/CMakeLists.txt.template BSD (3 clause) plugins/debug/CMakeLists.txt BSD (3 clause) plugins/debug/DebugPlugin.cpp GPL2+ plugins/debug/DebugPlugin.h GPL2+ plugins/debug/kwaveplugin_debug.desktop.in GPL2+ + plugins/export_k3b/CMakeLists.txt BSD (3 clause) + plugins/export_k3b/K3BExportDialog.cpp GPL2+ + plugins/export_k3b/K3BExportDialog.h GPL2+ + plugins/export_k3b/K3BExportPlugin.cpp GPL2+ / Sebastian Trueg , + Gustavo Pichorim Boiko + Michal Malek + plugins/export_k3b/K3BExportPlugin.h GPL2+ + plugins/export_k3b/K3BExportWidget.cpp GPL2+ + plugins/export_k3b/K3BExportWidget.h GPL2+ + plugins/export_k3b/K3BExportWidegetBase.ui GPL2+ + plugins/export_k3b/kwaveplugin_export_k3b.desktop.in GPL2+ + plugins/goto/CMakeLists.txt BSD (3 clause) plugins/goto/GotoDialog.cpp GPL2+ plugins/goto/GotoDialog.h GPL2+ plugins/goto/GotoDlg.ui (should be GPL2+) plugins/goto/GotoPlugin.cpp GPL2+ plugins/goto/GotoPlugin.h GPL2+ plugins/goto/GotoPluginBase.cpp GPL2+ plugins/goto/GotoPluginBase.h GPL2+ plugins/goto/InsertAtPlugin.cpp GPL2+ plugins/goto/InsertAtPlugin.h GPL2+ plugins/goto/kwaveplugin_goto.desktop.in GPL2+ plugins/goto/kwaveplugin_insert_at.desktop.in GPL2+ plugins/fileinfo/BitrateSpinBox.cpp GPL2+ plugins/fileinfo/BitrateSpinBox.h GPL2+ plugins/fileinfo/BitrateWidgetBase.ui (should be GPL2+) plugins/fileinfo/BitrateWidget.cpp GPL2+ plugins/fileinfo/BitrateWidget.h GPL2+ plugins/fileinfo/CMakeLists.txt BSD (3 clause) plugins/fileinfo/CompressionWidgetBase.ui (should be GPL2+) plugins/fileinfo/CompressionWidget.cpp GPL2+ plugins/fileinfo/CompressionWidget.h GPL2+ plugins/fileinfo/FileInfoDialog.cpp GPL2+ plugins/fileinfo/FileInfoDialog.h GPL2+ plugins/fileinfo/FileInfoDlg.ui (should be GPL2+) plugins/fileinfo/FileInfoPlugin.cpp GPL2+ plugins/fileinfo/FileInfoPlugin.h GPL2+ plugins/fileinfo/KeywordWidgetBase.ui (should be GPL2+) plugins/fileinfo/KeywordWidget.cpp GPL2+ plugins/fileinfo/KeywordWidget.h GPL2+ plugins/fileinfo/kwaveplugin_fileinfo.desktop.in GPL2+ plugins/fileinfo/SelectDateDialog.cpp GPL2+ plugins/fileinfo/SelectDateDialog.h GPL2+ plugins/fileinfo/SelectDateDlg.ui (should be GPL2+) plugins/labeler/LabelerPlugin.cpp GPL2+ plugins/labeler/LabelerPlugin.h GPL2+ plugins/labeler/gui/LabelView.cpp GPL2+ plugins/labeler/gui/LabelView.h GPL2+ plugins/lowpass/CMakeLists.txt BSD (3 clause) plugins/lowpass/kwaveplugin_lowpass.desktop.in GPL2+ plugins/lowpass/LowPassDialog.cpp GPL2+ plugins/lowpass/LowPassDialog.h GPL2+ plugins/lowpass/LowPassDlg.ui (should be GPL2+) plugins/lowpass/LowPassFilter.cpp GPL2+ / Juhana Sadeharju plugins/lowpass/LowPassFilter.h GPL2+ / Juhana Sadeharju plugins/lowpass/LowPassPlugin.cpp GPL2+ plugins/lowpass/LowPassPlugin.h GPL2+ plugins/memory/CMakeLists.txt BSD (3 clause) plugins/memory/kwaveplugin_memory.desktop.in GPL2+ plugins/memory/MemDlg.ui (should be GPL2+) plugins/memory/MemoryDialog.cpp GPL2+ plugins/memory/MemoryDialog.h GPL2+ plugins/memory/MemoryPlugin.cpp GPL2+ plugins/memory/MemoryPlugin.h GPL2+ plugins/newsignal/CMakeLists.txt BSD (3 clause) plugins/newsignal/kwaveplugin_newsignal.desktop.in GPL2+ plugins/newsignal/NewSigDlg.ui (should be GPL2+) plugins/newsignal/NewSignalDialog.cpp GPL2+ plugins/newsignal/NewSignalDialog.h GPL2+ plugins/newsignal/NewSignalPlugin.cpp GPL2+ plugins/newsignal/NewSignalPlugin.h GPL2+ plugins/noise/CMakeLists.txt BSD (3 clause) plugins/noise/kwaveplugin_noise.desktop.in GPL2+ plugins/noise/NoiseDialog.cpp GPL2+ plugins/noise/NoiseDialog.h GPL2+ plugins/noise/NoiseDlg.ui GPL2+ plugins/noise/NoiseGenerator.cpp GPL2+ plugins/noise/NoiseGenerator.h GPL2+ plugins/noise/NoisePlugin.cpp GPL2+ plugins/noise/NoisePlugin.h GPL2+ plugins/normalize/CMakeLists.txt BSD (3 clause) plugins/normalize/kwaveplugin_normalize.desktop.in GPL2+ plugins/normalize/NormalizePlugin.cpp GPL2+ plugins/normalize/NormalizePlugin.h GPL2+ plugins/notch_filter/CMakeLists.txt BSD (3 clause) plugins/notch_filter/kwaveplugin_notch_filter.desktop.in GPL2+ plugins/notch_filter/NotchFilter.cpp GPL2+ / Dave Flogeras / Juhana Sadeharju plugins/notch_filter/NotchFilterDialog.cpp GPL2+ / Dave Flogeras plugins/notch_filter/NotchFilterDialog.h GPL2+ / Dave Flogeras plugins/notch_filter/NotchFilterDlg.ui (should be GPL2+ / Dave Flogeras) plugins/notch_filter/NotchFilter.h GPL2+ / Dave Flogeras plugins/notch_filter/NotchFilterPlugin.cpp GPL2+ / Dave Flogeras plugins/notch_filter/NotchFilterPlugin.h GPL2+ / Dave Flogeras plugins/pitch_shift/CMakeLists.txt BSD (3 clause) plugins/pitch_shift/kwaveplugin_pitch_shift.desktop.in GPL2+ plugins/pitch_shift/PitchShiftDialog.cpp GPL2+ plugins/pitch_shift/PitchShiftDialog.h GPL2+ plugins/pitch_shift/PitchShiftFilter.cpp GPL2+ / Jeff Tranter + Stefan Westerfeld plugins/pitch_shift/PitchShiftFilter.h GPL2+ plugins/pitch_shift/PitchShiftDlg.ui (should be GPL2+) plugins/pitch_shift/PitchShiftPlugin.cpp GPL2+ plugins/pitch_shift/PitchShiftPlugin.h GPL2+ plugins/playback/CMakeLists.txt BSD (3 clause) plugins/playback/kwaveplugin_playback.desktop.in GPL2+ plugins/playback/PlayBack-ALSA.cpp GPL2+ / (parts from) Jaroslav Kysela plugins/playback/PlayBack-ALSA.h GPL2+ plugins/playback/PlayBackDialog.cpp GPL2+ plugins/playback/PlayBackDialog.h GPL2+ plugins/playback/PlayBackDlg.ui (should be GPL2+) plugins/playback/PlayBack-OSS.cpp GPL2+ plugins/playback/PlayBack-OSS.h GPL2+ plugins/playback/PlayBack-PulseAudio.cpp GPL2+ plugins/playback/PlayBack-PulseAudio.h GPL2+ plugins/playback/PlayBack-Qt.cpp GPL2+ plugins/playback/PlayBack-Qt.h GPL2+ plugins/playback/PlayBackPlugin.cpp GPL2+ plugins/playback/PlayBackPlugin.h GPL2+ plugins/record/CMakeLists.txt BSD (3 clause) plugins/record/krec_record.xpm LGPL2 (crystal project) [converted from mix_record.png] plugins/record/kwaveplugin_record.desktop.in GPL2+ plugins/record/LevelMeter.cpp GPL2+ / Rik Hemsley plugins/record/LevelMeter.h GPL2+ / Rik Hemsley plugins/record/Record-ALSA.cpp GPL2+ plugins/record/Record-ALSA.h GPL2+ plugins/record/Record-OSS.cpp GPL2+ plugins/record/Record-OSS.h GPL2+ plugins/record/Record-PulseAudio.cpp GPL2+ plugins/record/Record-PulseAudio.h GPL2+ plugins/record/Record-Qt.cpp GPL2+ plugins/record/Record-Qt.h GPL2+ plugins/record/RecordController.cpp GPL2+ plugins/record/RecordController.h GPL2+ plugins/record/RecordDevice.h GPL2+ plugins/record/RecordDialog.cpp GPL2+ plugins/record/RecordDialog.h GPL2+ plugins/record/RecordDlg.ui (should be GPL2+) plugins/record/RecordingState.xmi (should be GPL2+) plugins/record/RecordParams.cpp GPL2+ plugins/record/RecordParams.h GPL2+ plugins/record/record_pause2.xpm (should be GPL2+) plugins/record/record_pause.xpm (should be GPL2+) plugins/record/RecordPlugin.cpp GPL2+ plugins/record/RecordPlugin.h GPL2+ plugins/record/RecordPlugin.png (should be GPL2+) plugins/record/RecordState.h GPL2+ plugins/record/record_stop.xpm (should be GPL2+) plugins/record/RecordThread.cpp GPL2+ plugins/record/RecordThread.h GPL2+ plugins/record/RecordTypesMap.cpp GPL2+ plugins/record/RecordTypesMap.h GPL2+ plugins/record/StatusWidget.h GPL2+ plugins/record/StatusWidget.cpp GPL2+ plugins/record/SampleDecoder.h GPL2+ plugins/record/SampleDecoderLinear.cpp GPL2+ plugins/record/SampleDecoderLinear.h GPL2+ plugins/record/stop_hand.xpm free / KDE -> icons/ikons/16x16/actions/stop_hand.png plugins/record/ok.xpm free / KDE -> icons/crystalsvg/16x16/actions/ok.png plugins/record/ledgreen.xpm GPL2 (kdelirc) plugins/record/ledlightgreen.xpm GPL2 (kdelirc) plugins/record/ledred.xpm GPL2 (kdelirc) plugins/record/ledyellow.xpm GPL2 (kdelirc) plugins/record/walk_r1.xpm GPL2 (amor) plugins/record/walk_r2.xpm GPL2 (amor) plugins/record/walk_r3.xpm GPL2 (amor) plugins/record/walk_r4.xpm GPL2 (amor) plugins/record/walk_r5.xpm GPL2 (amor) plugins/record/walk_r6.xpm GPL2 (amor) plugins/record/walk_r7.xpm GPL2 (amor) plugins/record/walk_r8.xpm GPL2 (amor) plugins/reverse/CMakeLists.txt BSD (3 clause) plugins/reverse/kwaveplugin_reverse.desktop.in GPL2+ plugins/reverse/ReversePlugin.h GPL2+ plugins/reverse/ReversePlugin.cpp GPL2+ plugins/samplerate/CMakeLists.txt BSD (3 clause) plugins/samplerate/kwaveplugin_samplerate.desktop.in GPL2+ plugins/samplerate/SampleRatePlugin.cpp GPL2+ plugins/samplerate/SampleRatePlugin.h GPL2+ plugins/saveblocks/CMakeLists.txt BSD (3 clause) plugins/saveblocks/kwaveplugin_saveblocks.desktop.in GPL2+ plugins/saveblocks/SaveBlocksWidgetBase.ui GPL2+ plugins/saveblocks/SaveBlocksDialog.h GPL2+ plugins/saveblocks/SaveBlocksDialog.cpp GPL2+ plugins/saveblocks/SaveBlocksPlugin.cpp GPL2+ plugins/saveblocks/SaveBlocksPlugin.h GPL2+ plugins/saveblocks/SaveBlocksWidget.cpp GPL2+ plugins/saveblocks/SaveBlocksWidget.h GPL2+ plugins/selectrange/CMakeLists.txt BSD (3 clause) plugins/selectrange/kwaveplugin_selectrange.desktop.in GPL2+ plugins/selectrange/SelectRangeDialog.cpp GPL2+ plugins/selectrange/SelectRangeDialog.h GPL2+ plugins/selectrange/SelectRangeDlg.ui (should be GPL2+) plugins/selectrange/SelectRangePlugin.cpp GPL2+ plugins/selectrange/SelectRangePlugin.h GPL2+ plugins/sonagram/CMakeLists.txt BSD (3 clause) plugins/sonagram/kwaveplugin_sonagram.desktop.in GPL2+ plugins/sonagram/SonagramDialog.cpp GPL2+ plugins/sonagram/SonagramDialog.h GPL2+ plugins/sonagram/SonagramDlg.ui (should be GPL2+) plugins/sonagram/SonagramPlugin.cpp GPL2+ plugins/sonagram/SonagramPlugin.h GPL2+ plugins/sonagram/SonagramWindow.cpp GPL2+ plugins/sonagram/SonagramWindow.h GPL2+ plugins/stringenter/CMakeLists.txt BSD (3 clause) plugins/stringenter/kwaveplugin_stringenter.desktop.in GPL2+ plugins/stringenter/StringEnterDialog.cpp GPL2+ plugins/stringenter/StringEnterDialog.h GPL2+ plugins/stringenter/StringEnterDlg.ui (should be GPL2+) plugins/stringenter/StringEnterPlugin.cpp GPL2+ plugins/stringenter/StringEnterPlugin.h GPL2+ plugins/volume/CMakeLists.txt BSD (3 clause) plugins/volume/kwaveplugin_volume.desktop.in GPL2+ plugins/volume/VolumeDialog.cpp GPL2+ plugins/volume/VolumeDialog.h GPL2+ plugins/volume/VolumeDlg.ui (should be GPL2+) plugins/volume/VolumePlugin.cpp GPL2+ plugins/volume/VolumePlugin.h GPL2+ plugins/zero/CMakeLists.txt BSD (3 clause) plugins/zero/kwaveplugin_zero.desktop.in GPL2+ plugins/zero/ZeroPlugin.cpp GPL2+ plugins/zero/ZeroPlugin.h GPL2+ samples/sample.opus CC BY-SA 3.0 scripts/create-testfile.kwave GPL2+ scripts/screenshots.kwave GPL2+ ### EOF ### diff --git a/doc/en/index.docbook b/doc/en/index.docbook index 84f17b1d..4079b4fc 100644 --- a/doc/en/index.docbook +++ b/doc/en/index.docbook @@ -1,8206 +1,8444 @@ Kwave"> + + ]> The &kwave; Handbook Thomas Eschenbacher
thomas.eschenbacher@gmx.de
1998-2000Martin Wilz &version_year;Thomas Eschenbacher &FDLNotice; 2017-01-29 0.9.3 (Applications 16.12) &kwave; is a simple sound editor built on &kf5-full;. KDE KF5 multimedia sound audio Kwave wav editor record playback sonagram FFT Linux
Introduction This is "&kwave;", a simple sound editor built on &kf5-full;. Its features include: a user interface that can be switched to SDI, MDI or Tab mode simple cut, copy and paste functions multi-level undo/redo labeling of signals Recording functionality, including pre-recording Playback via Qt, PulseAudio, ALSA and OSS Recording via PulseAudio, ALSA and OSS MP3 import/export Ogg/Vorbis and Opus import/export FLAC import/export some analysis functions such as Sonagram internally uses 24 bit fixed precision for sample data free selectable sample rates support for editing of multi channel files playback of multi channel audio files (audio output will be mixed down to mono or stereo if needed) extendible through an easy-to-use plugin interface import/export of other audio formats through audiofile If you are interested what has been done and what has still to be done, then look at the files CHANGES and TODO included in the source package. Help and constructive critics are always welcome. &kwave; Resources So if you want to get in contact with the developers, need some further help on using &kwave;, submit patches, bug reports or other stuff, the following resources might be of interest for you: Project Homepage For information about new up-to-date releases or some other information about this project, take a look at the &kwave; homepage Mailing List If you need some help on using &kwave; or want to get involved in the development, join the Kwave developer mailing list by visiting "&url_mailinglist;". GIT Repository There also is a new GIT repository hosted on KDE servers, and a mirror repository hosted by SourceForge where you can get the sources of the latest development version. For instructions on how to get access to the repository, read in the chapter about building from GIT in the developer documentation. There also is a GIT web interface on KDE and on SourceForge where you can use to browse through the sources. &kwave; Revision History This project has been started by Martin Wilz in summer 1998 and has been developed and improved by him and some other people. In November 1999 Thomas Eschenbacher has started to fix some little bugs here and there and stepped into the source code of the program deeper and deeper. Up to today he has extended, rewritten or revised nearly every component of the program and spent much time on improving it. Since &kwave; v0.8.0 the changelog is no longer included in this manual. So if you are interested in a complete list of changes, you can find the full history here: &url_changelog; or browse through the sources on your own through the GIT web interface. &kwave; version v0.9.0 is the first version hosted on KDE (kdereview) and SourceForge servers, followed by v0.9.1, the first version for &kf5-full;. Basics about digital audio This chapter should give a short introduction about the basics of digital audio processing, without going too much into details. Of course this might be a bit incomplete, but if you have questions, you can ask at the &kwave; mailing list or consult some further literature. The analogue world First of all, one must know that the world is analogue - but computers work digitally. So there are several ways to convert analogue audio to digital audio and back again. As the way from digital to analogue normally is the reversion of the way from analogue to digital, we only describe the way from analogue to digital. Conversion from sound to bits Conversion from sound to bits Before continuing, analogue audio has to be transformed into electronic signals in order to find its way into a computer. One common way to do this is by using a microphone and an amplifier. This combination gets sound (changes of air pressure) at its input and a voltage at its output. Higher amplitude of the pressure changes will be represented by higher voltages at the amplifier's output. This output is also called a 'signal'. Instead of a microphone you can of course also imagine other sources of audio. And the "amplifier" can be the one that is integrated into your sound card, where you normally cannot see it. Conversion to electronic signal Conversion to electronic signal At this stage, the electrical signal has three limitations that one should keep in mind: The amplitude (volume) is limited to some maximum level. This is a consequence of the electronic (amplifiers) that are only able to handle voltages within some specific range. That's no problem as long as sounds are not too loud. In that case the signal would be clipped, which means that the electrical signal will run against its margins and the result will be disturbed. The frequency range is also limited. Due to the mechanical constrains of microphones and the limited frequency range of amplifiers, a signal's frequency range is limited. There are no hard borders besides which the sound abruptly disappears, but below some low and above some higher frequency the amplitude of the signal starts to decrease more and more. The existence of a maximum frequency can be easily understood as a limited speed of the electrical signal to rise and fall. By using high quality amplifiers and microphones, the limits can be spread into ranges where the human ear is no longer able to hear their results and thus get out of interest. The human ear normally is not able to hear sound above 20 kHz. The signal contains noise. Noise is the most ugly enemy of everyone who has to handle audio signals in any way. Noise is a typical analogue effect, that makes the audio signal "unsharp" and disturbed, it is always present and cannot be avoided. One can only try to use high quality components that produce as low noise as possible, so that one cannot hear it. Normally noise has a certain volume, so that the interesting sound should be much louder in comparison to the noise. This is called the signal to noise ratio (SNR), the higher it is the better the sound's quality will be. Sounds that have lower volume than the noise cannot be heart. Digitalization When we want to store and play audio in a computer, we must convert the analogue sound into digital data first. This process is called digitalization. It converts an electronic signal into a sequence of digital values. Digitalization of the electronic signal Digitalization of the electronic signal The conversion can be understood as a repetitive measurement of the electronic signal's value at certain time, thus taking a sample of the signal. The result is then encoded as a digital value. The sampling could be done in arbitrary distances or in constant intervals. The later method is much easier to handle, and thus it is normally used, with a constant rate - the so-called sample rate. Usual sample rates are 8000, 11025, 22050, and 44100 samples per second. In practice sample rates are also given as frequencies, in Hz or kHz. The sample rate limits the highest frequency a digitized signal can represent. Due to Shannon's theorem the highest usable frequency is half of the sample rate, so with 44.1 kHz sample rate you cannot sample signals with more than 22 kHz. To avoid a violation of that half-sample rate rule, your soundcard already has built-in filters that filter away frequencies that are higher than half of the used sample rate. Sampled signal Sampled signal Sample Encoding The result of the digital sampling process is a sequence of single samples. One sample is a digital representation of a signal's value at a certain time. The value of a sample can be interpreted and encoded in several ways. The simplest one is linear encoding. This means that each sample's value directly represents the analogue signal's value multiplied with a constant factor. This is easy to handle, but has the disadvantage that noise will be audible especially on low amplitudes, where it disturbs most, and less audible on high amplitudes, where it is less audible. One way to reduce the influence of noise is non-linear encoding. This means that lower amplitudes are amplified before processing. As lower amplitudes are amplified, their distance from noise increases and the quality improves. The most common methods for this are A-Law and U-Law encoding - some standardized logarithmic amplification curves, used in digital telephony (ITU G.711 standard). Nonlinear Encoding Nonlinear Encoding Sample Formats Samples can be stored in different formats and precisions. The most common ones are integer (fixed-point) formats, that store values with fixed quantisations. Depending on where the zero line is defined, it has to be destinguished between unsigned (only positive values, "zero line" is at half of the numeric range) and signed (positive and negative values) integer formats. Signed Format Signed Format Unsigned Format Unsigned Format As the quantisation loses some accuracy, it produces noise, the so-called quantisation noise. That kind of noise has more effect on low amplitudes, so this method of storing samples is not optimal, but quite easy and very fast to handle (computers are fast in calculating with fixed point numbers). The second way of encoding samples is with floating point numbers. With floating point numbers, noise is spread nearly equal over all ranges of amplitudes and has advantages especially on low amplitudes. However, this format is much slower when used for processing (computers are much slower on calculating with floating point values in comparison to fixed point numbers). &kwave; internally uses signed integer format with 24 bit precision, stored in 32 bit integers. This has the disadvantage of higher memory consumption when processing files with lower precision (⪚ 8 bits), but processing 32 bit numbers is very fast and also leaves some reserves for internal calculations, as only 24 bits are normally used. Using &kwave; Here is a little screenshot of the &kwave; main window, so that you get an impression what &kwave; looks like... Here's a screenshot of &kwave; Screenshot of the Main Window User Interface Mode Depending on your personal preferences or use cases you can configure how &kwave; handles multiple open files. You can switch this setting on the fly through the menu SettingsShow Files in... . The three possible settings are: Separate Windows (SDI): When using the Single Document Interface (SDI), each file will be shown in a separate main window. screenshot of &kwave; in SDI mode Screenshot of SDI mode Same Window (MDI): When using the Multi Document Interface (MDI), there is only one &kwave; main window, but within this window you have an area which shows sub windows, which can be resized, moved, tiled, cascaded or minimized. You can select a window from the Windows menu or cycle through the sub windows with &Ctrl;Tab. screenshot of &kwave; in MDI mode Screenshot of MDI mode Tabs: This is a variant of the MDI interface, where files are shown within separate tabs. You may know this mode from some popular Internet browsers. You can activate a tab via the Windows menu or cycle through the tabs with &Ctrl;Tab. screenshot of &kwave; in TAB mode Screenshot of TAB mode Memory Setup When using &kwave; for the first time, you should go to the memory setup dialog and modify the settings to be suitable for your needs and the installed memory of your computer. You can reach it under SettingsMemory... . Here's a screenshot of &kwave;'s memory setup dialog Screenshot of the Memory Setup Dialog &kwave; is able to use two types of memory: physical and virtual memory. Physical memory is the memory (RAM) that is installed in your computer. You should limit the usage of physical memory to some reasonable size, as a rule of thumb, half of the installed memory should be ok. If you set the limit too high, Linux will take memory from other applications, which means that it swaps out memory of other programs to the hard disk (swap), which is rather slow. If you set the limit too low, you might lose some performance when working with big files, because you use less of the fast physical memory than you could. If you enable virtual memory, &kwave; is able to load and process files that are bigger than the amount of real installed physical memory. &kwave; does this by using temporary files in a configurable directory, which is much faster and more cooperative to other applications than using the operating system's swapping. The directory that you configure should be on your local hard disk. Command Line List of Files or Commands If you start &kwave; from the command line, you can specify a list of files that should be opened. The first specified file will be opened first, then the other files. Each file will be opened in an own new window or sub window of the same &kwave; instance. If you specify wildcards, you can open a large number of files at once. For example, the following command starts a &kwave; and opens all sounds of the KDE window manager, each in a new window or sub window: % kwave /usr/share/sounds/KDE-*.ogg It is also possible to pass &kwave; text commands, encoded as a special URIuniversal resource identifier, this will be described in a later section. GUI Type The parameter --gui=SDI|MDI|TAB lets &kwave; start in one of the three possible GUI modes: SDI, MDI or TAB. Qt Toolkit options In addition to a list of files, you can specify a list of Qt toolkit options like -qwindowgeometry for specifying the size and/or position of the first opened &kwave; window and/or -display for starting the &kwave; on a different display. For example, the following command starts a &kwave; window with an initial width of 600 pixels and a height of 400 pixels, with the right border positioned 30 pixels away from the right and 0 pixels away from the top of the screen. % kwave --disable-splashscreen -qwindowgeometry 600x400-30+0 Startup Options With the option --disable-splashscreen you can disable the splash screen that comes up when starting &kwave;. This might be useful when you start &kwave; from a script. The command line option --iconic lets &kwave; start up minimized (iconified). This might be useful when you want to start &kwave; without GUI interaction, ⪚ when running from a script. This option also implicitly disables the splash screen! By using the command line option --logfile=kwave.log you can log the sequence of actions of a &kwave; session into a file. This is useful for debugging, you might be asked for such a logfile when reporting an error. Opening and Saving files Opening files with &kwave; works like in most other applications, you can specify a list of files on the command line when starting &kwave;, open an empty &kwave; window (for example with &Ctrl;W FileNew... ) and put a file into it via drag and drop, or you can open a file through the menu with &Ctrl;O FileOpen or one of the last recently opened files under FileOpen Recent save the current file with &Ctrl;S FileSave , save under a different name with &Shift;&Ctrl;S FileSaveAs... save all areas that are separated by markers, each one to an own file, with FileSaveBlocks... or only the current selection with FileSaveSelection... Supported File formats &kwave; supports the following file formats: The favourite file format of &kwave; is (like you can guess from the name) .wav. This format is very common to other "operating systems" and also is commonly used within the KDE environment. The second format that &kwave; supports is "ASCII". You can export to and also import from ASCII. Please be aware that storing in this format might produce very large files! The file format will be described below. .mp3 and .mp2 import is available through libmad for the MP3 decoding in combination with id3lib for decoding ID3 tags and lame for encoding. Ogg/Vorbis (*.ogg) import and export. See &url_ogg_vorbis; for details. FLAC (*.flac) import and export. See &url_flac; for details. Additionally you can import file formats like *.8svx (Amiga IFF/8SVX Sound File Format), *.au (NeXT, Sun Audio), *.aiff (Audio Interchange Format), *.avr (Audio Visual Research File Format), *.caf (Core Audio Format), *.nist (NIST SPHERE Audio File Format), *.sf (Berkeley, IRCAM, Carl Sound Format), *.smp (Sample Vision Format), *.snd (NeXT, Sun Audio), *.voc (Creative Voice) and others through the audiofile plugin. Converting to and from .wav The best way to work with formats other than those supported by &kwave; is to use an external converter program. A good set of tools for this is in the SoX package, they have also some nice documentation! The plans for future include support for import and also export filters for more formats and maybe some filter that uses a user-definable script with a call to an external filter, so that even formats not supported by SoX (like MP3) can be read and/or written. Format of ASCII files The ASCII format is quite useful for scientific and educational purposes. Due to it's simple format, you can either write simple files on your own with a text editor or you can use the output of some other application and convert it into ASCII. As the format is really simple, you should not have big problems in writing a converter and most scientific applications use to have some kind of their own ASCII format for export. The format of an ASCII file is quite simple and has the following rules: At the start of the file comes a block of properties, with one property per line. Each property line starts with ##. After the properties comes a list of samples, with one sample per line. When using multiple channels, the samples are separated by commas. Lines might end with a carriage return and/or a line feed character (so DOS files are supported too). But when saving, files will always be saved with line feed character as the end of the line. Empty lines and characters after a # are treated as comments and are ignored. Values have to be given in signed integer format with a 24 bit range, which is the internal storage format of &kwave;. Everything after a # (except property lines, see above) will be treated as comment and will be ignored. Empty lines will also be ignored. Here is an example of a simple ASCII file that represents a sine wave with eleven samples: content of an ASCII file with a single sine wave ## 'rate'=44100 ## 'tracks'=2 ## 'bits'=16 ## 'length'=11 ## 'Date'='2013-11-09' ## 'Software'='Kwave-0.8.11 for KDE 4.11.3' 5930496, 5930496 # 0 0, 8388352 # 1 -5930752, 5930496 # 2 -8388608, 0 # 3 -5930752, -5930752 # 4 0, -8388608 # 5 5930496, -5930752 # 6 8388352, 0 # 7 5930496, 5930496 # 8 0, 8388352 # 9 -5930752, 5930496 # 10 # EOF Creating a New File You can create a new and empty file menu under FileNew... . Here's a screenshot of &kwave;'s new file dialog Screenshot of the File New Dialog You can select the sample rate, resolution in bits per sample and the number of tracks. Per default the file format will be ".wav", but it can still be changed at the time when the file is saved. The length of the new signal can be set by time (hours, minutes, seconds) or by the number of samples. Additionally you can select it relative to the highest possible length, which is limited by the available memory and &kwave;'s internal limit (2 GB). Recording &kwave; is able to record audio data from various sources, with all sample rates, sample formats and other modes that your sound hardware supports. Currently &kwave; records through the old OSS sound interface, and since v0.7.4 also the newer and more powerful ALSA interface that is the preferred choice for linux kernel 2.6. The recording can be reached from the menu under FileRecord . Here is a screenshot of the &kwave; record dialog, showing the first page with the recording controls during a running recording session. Like in most dialogs of &kwave; you can get some help or see tooltips on the controls. Here's a screenshot of &kwave;'s record dialog Screenshot of the Record Dialog Here you have the following controls: Pre-Record: If the pre-recording feature of &kwave; is enabled and the recording is started, &kwave; records into an internal buffer which is some seconds long. If you press the Record ( record button ) button again, then the recording really starts, and also keeps the already pre-recorded data. This is useful for example if you want to record your favorite song from radio, but you recognize too late that the song has started. In this case you can still press the record button and get the start of the song from what &kwave; has already pre-recorded before, so that you will no longer miss a start. Record Time: If the length of the recording should be limited to some time, you can activate this setting and select a time in hours, minutes, seconds for your recording. If this option is not enabled, the recording runs until you press the Stop ( stop button ) button. Start At: If this setting is activated, you can set a date and time when the recording will be started. Please keep in mind that if the configured time is in the past, the recording will start immediately. Record Trigger: If enabled, the recording starts only if the volume of the input goes over a certain limit, which can be defined from 0 to 100% of the highest possible input volume. This is useful if you do not want to record leading silence. (Hint: combine this with the prerecording feature mentioned above to catch also some seconds before reaching the trigger, so that you don't miss any silent fade-ins.) The New ( new button ) button is active when the recording is not running or is finished, to discard the current file content and start again. The Stop ( stop button ) button is active when the recording or pre-recording is running or &kwave; is waiting for the trigger. If pressed, the current progress will be stopped. The Pause ( pause button ) button is active when the recording or pre-recording is running. The first time you press it, the recording will be halted and the button starts blinking. When you press it again the button will stop blinking and recording will continue immediately, without waiting for a trigger. The Record ( record button ) button starts the recording and/or prerecording, depending on the features enabled above: If neither prerecording nor trigger level are used, the recording starts as soon as you press the record button. If prerecording is not used and a trigger level is set, the first press will let &kwave; wait for the trigger level to be reached. While waiting for a trigger, you can force the recording to start immediately by pressing the record button again, otherwise the recording will start automatically when the trigger level has been reached. If prerecording is enabled, the first press starts only the prerecording and the second press really starts the recording. Playback Depending on the compilation options &kwave; is able to play sounds trough one of the following playback methods: ALSA (Advanced Linux Sound Architecture): Supercedes OSS, supports more features and more hardware. Might collide with KDE or other applications like OSS does, but has a plugin called "dmix" as a way out. Newer versions of ALSA use a dmix like plugin per default, so this should the best choice for you! OSS (Open Sound System): The oldest linux implementation, capable of mono and stereo output. Deprecated since linux kernel 2.6, but still wide spread. Might collide with KDE or other sound applications, only one application at a time can use OSS playback ! Before trying to play sounds, you should take a look on the playback configuration dialog: Here's a screenshot of &kwave;'s playback setup dialog Screenshot of the Playback Setup Dialog Currently &kwave; supports only 8 and 16 bit playback, with mono or stereo output through the OSS interface, but many also all modes your sound hardware supports through the ALSA interface. If your sound file uses more or less channels than the playback allows, all channels will be mixed together during playback. For example if you have a file with three channels and you use stereo playback, the left channel will play channel 0 (upper) and half of channel 1 (middle), the right channel will play the half of channel 1 (middle) and channel 2 (lower). For getting a smooth playback without interruptions, you should also set the buffer size to an appropriate value. If you encounter problems with interrupted playback, you should increase the buffer size here. But the bigger you set the buffer, the bigger is the latency between the audible sound and the display of the playback position in the signal display. The playback settings dialog also provides a button for playing a simple test sound. You should hear a 440Hz tone that wanders over all speakers, from one to the next. Once you have configured playback, you can use the playback controls of the &kwave; main window or through the Play menu or with keyboard shortcuts: P PlayStart : Start playback of the current selection from its beginning or the whole file from the current cursor position if nothing was selected. Play only once. PlayLoop : Like before, but repeat in a loop. Space PlayPause : Pause the playback at the current position. Only available when the playback is running. Space PlayContinue : Continue the playback from the position where it has been paused. Only available if the playback is paused. Esc PlayStop : Stop the playback, go back to the start of the selection. File Properties &kwave; is able to handle several meta information that is stored within an audio file. It tries to import and export as much of that information as possible. For example, if you import an MP3 file with ID3 tags, you can keep that information when exporting to a Wave file. If &kwave; would lose meta information when saving, it shows a warning. You can view and modify the meta information under EditFile Properties... . There you can also change things like sample format, resolution and compression. Here's a screenshot of &kwave;'s file properties dialog Screenshot of the File Properties Dialog Zooming and navigating &kwave; provides several ways to zoom and navigate, using keyboard shortcuts, menu commands, toolbar buttons and by using the mouse. The following sections should give an overview on how to use all of these functions. Zooming in and out zoom to whole signal: selects a zoom factor that makes the whole signal visible in the current window. menu entry: ViewZoom to whole signal toolbar button: zoom all button zoom to 100%: zooms in up to a scale where on sample is represented by on pixel on the screen. menu entry: ViewZoom to 100% toolbar button: zoom to 100% button zoom in: zooms in to see more details, magnifies by factor 3. menu entry / keyboard shortcut: &Ctrl;+ ViewZoom In toolbar button: zoom in button zoom out: zooms in to see less details, shrinks by factor 3. menu entry / keyboard shortcut: &Ctrl;- ViewZoom Out toolbar button: zoom out button zoom selection: zooms to a factor where the current selection is completely visible in the current view. menu entry / keyboard shortcut: &Ctrl;Space ViewZoom to Selection toolbar button: zoom to selection button select predefined zoom: select a zoom factor from the zoom combo box in the toolbar. Scrolling left and right scroll left: scrolls to the start of the signal by 1/3 of the current view. menu entry / keyboard shortcut: cursor Left ViewScroll left toolbar button: scroll left button scroll right: scrolls to the end of the signal by 1/3 of the current view. menu entry / keyboard shortcut: cursor right ViewScroll right toolbar button: scroll right button previous page: scrolls to the position right before the current view (left). menu entry / keyboard shortcut: Page up ViewPrevious Page toolbar button: previous page button next page: scrolls to the position right after the current view (right). menu entry / keyboard shortcut: Page down ViewNext Page toolbar button: next page button to begin: scrolls the current view so that it starts at the beginning of the signal. menu entry / keyboard shortcut: &Ctrl;Home ViewBegin to end: scrolls the current view so that it ends at the end of the signal. menu entry / keyboard shortcut: &Ctrl;End ViewEnd Using the overview The main screen of &kwave; shows a small overview of the whole signal above the horizontal scroll bar of the main window. This overview also provides some functionality for navigating: single click with left mouse button: directly move the current view to the clicked position. double click with left mouse button: directly move the current view to the clicked position and additionally zoom in. double click with left mouse button, with &Shift; pressed: directly move the current view to the clicked position and additionally zoom out. Vertical zoom You can zoom the current view vertically by pressing the Alt key and scrolling with the mouse wheel. How to select &kwave; allows you to select a continuous range of samples as well as any combination of channels (if you edit a multi-channel file). By selecting a range of samples (time scope) all following commands will be limited to that range and by de-selecting a channel its content will not be changed. Selecting channels Selecting or de-selecting a channel is quite simple. Just click on the lamp symbol on the left side of the signal to toggle its state: green lamp a green lamp means "enabled", whereas red lamp a red lamp means "disabled". Note: If a channel is de-selected it will also not be audible for playback! Selecting samples If you select a range of samples in &kwave;, that range will be inclusive. That means that the first and the last selected sample both belong to the selection and will be used for the following actions. So even if you not selected a range but only a single sample, the selection will never be really "empty". So for example if you see no selected range, the "delete" function applies to that single sample. The easiest way of selecting a range of samples is just to do that with mouse. It works like you are used from other applications: just press the left mouse button at the point you want to let the selection start and release the button where you want it to end. If you want to adjust or move the selection's start or end, you can move the mouse cursor near to the start or the end of the selection until it changes from the standard arrow cursor into the left-right arrow cursor and then press the left mouse button and adjust. You can also extend or shrink the selection to a specific point by holding down the &Shift; key while clicking with the left mouse button. Depending on which border is nearer, the left or right border of the selection will be set to a new position. There are also some functions available via the menu and of course some keyboard shortcuts: select the whole signal: &Ctrl;A EditSelectionAll remove any selection and select "nothing": N EditSelectionNothing the currently visible area: V EditSelectionVisible the next block of samples, starting one sample after the end of the current selection and with the same length: &Shift;+ EditSelectionNext (Hint: use the "+" key from the numeric keypad!) the previous block of samples, ending one sample before the start of the current selection and with the same length: &Shift;- EditSelectionPrevious (Hint: use the "-" key from the numeric keypad!) expand the selection to the start of the signal (first sample): &Shift;Home EditSelectionto start expand the selection to the end of the signal (last sample): &Shift;End EditSelectionto end expand the current selection left and right up to the next label (or start/end of the signal if there is none), starting at the current cursor position: E EditSelectionExpand to labels select the area between the next two labels that are right from the current selection or up to the end of the signal: &Shift;&Ctrl;N EditSelectionto next labels select the area between the previous two labels that are left from the current selection or up to the start of the signal: &Shift;&Ctrl;P EditSelectionto previous labels Clipboard &kwave; uses the clipboard of &plasma;. This way it is possible to exchange audio data between different &kwave; windows. It might be possible as well to exchange data between &kwave; and other audio applications, depending on their ability to use the &plasma; clipboard. When copying data to the clipboard through the copy function &kwave; uses the mime type audio/vnd.wave as data format, conforming to RFC 2361 which is the same as the well known wav format. When pasting from the clipboard into &kwave; all data formats that are available as file import formats are supported, like for example Ogg/Vorbis, FLAC and so on. Drag and Drop &kwave; supports the KDE Drag and Drop protocol. This enables you to open files just by picking them up in a &dolphin; or &konqueror; window or the Desktop and let them drop into a window of &kwave;. Please note that if you drop a file into a &kwave; window that already contains an opened file, the currently opened file will be closed first and then the file you dropped will be opened in it. If you don't want that, you should open a new empty &kwave; window first. You can also select a range of samples and drag or drop them into a &kwave; window. Per default the drag operation is done in move mode where the selected range is deleted from the original place and inserted at the drop position. By pressing the Ctrl key you can modify this and drag in copy mode instead. Automization and Scripting with &kwave; &kwave; since its first version uses an internal text command language. This command language is used internally for menu handling, GUI control, builtin effects and plugin invocations. The commands will be described later in the section . General Syntax All commands consist of a command name and an optional parameter list in round brackets, depending on the command. Allowed characters for command names are letters, digits and colon. Commands are case sensitive and are always in lower case. Parameters within a parameter list are separated by comma. Numerical parameters can be given as fixed point numbers or as floating point numbers, using a dot as decimal separator. String parameters are automatically trimmed (all white space at the start and at the end is removed). If that is not wanted, they can be surrounded by double quotes ("). If a string parameter contains special characters (like ,, ;, # or a \ itself), these special characters have to be escaped by preceding a \. Multiple commands can be concatenated to a command list by using a ; as separator. Example: fileinfo(Comments,"This is an \"example\" comment.") This example consists of the command fileinfo and has two parameters: the keyword Comments and the text "This is an \"example\" comment.". (These parameters are explained in the corresponding section in the command reference). Using the Command Line In addition to the command line options listed in the section Command Line which are used to start &kwave; in iconified mode or without splash screen, you can pass text commands on the command line, encoded in a special URI format: kwave:command[?parameter[,parameter ...] ] The rules for transforming a &kwave; text command into a valid URI are as follows: The URI starts with the word kwave, followed by a : and the command name. If the command has parameters, they have to be appended after the command name, using a ? as separator. Multiple parameters can be appended by using a , as separator. All special characters in command name and parameters have to be URL encoded. Here a list of the translations: URL Encoding Translation Table originalencoded&no-i18n-unicode-0x0020; originalencoded&no-i18n-unicode-0x0020; originalencoded&no-i18n-unicode-0x0020; originalencoded (space)&no-i18n-urlenc-20; &no-i18n-unicode-0x0028;&no-i18n-urlenc-28; &no-i18n-unicode-0x003A;&no-i18n-urlenc-3A; &no-i18n-unicode-0x005C;&no-i18n-urlenc-5C; &no-i18n-unicode-0x0021;&no-i18n-urlenc-21; &no-i18n-unicode-0x0029;&no-i18n-urlenc-29; &no-i18n-unicode-0x003B;&no-i18n-urlenc-3B; &no-i18n-unicode-0x005D;&no-i18n-urlenc-5D; &no-i18n-unicode-0x0022;&no-i18n-urlenc-22; &no-i18n-unicode-0x002A;&no-i18n-urlenc-2A; &no-i18n-unicode-0x003C;&no-i18n-urlenc-3C; &no-i18n-unicode-0x005E;&no-i18n-urlenc-5E; &no-i18n-unicode-0x0023;&no-i18n-urlenc-23; &no-i18n-unicode-0x002B;&no-i18n-urlenc-2B; &no-i18n-unicode-0x003D;&no-i18n-urlenc-3D; &no-i18n-unicode-0x005F;&no-i18n-urlenc-5F; &no-i18n-unicode-0x0024;&no-i18n-urlenc-24; &no-i18n-unicode-0x002C;&no-i18n-urlenc-2C; &no-i18n-unicode-0x003E;&no-i18n-urlenc-3E; &no-i18n-unicode-0x0060;&no-i18n-urlenc-60; &no-i18n-unicode-0x0025;&no-i18n-urlenc-25; &no-i18n-unicode-0x002D;&no-i18n-urlenc-2D; &no-i18n-unicode-0x003F;&no-i18n-urlenc-3F; &no-i18n-unicode-0x007B;&no-i18n-urlenc-7B; &no-i18n-unicode-0x0026;&no-i18n-urlenc-26; &no-i18n-unicode-0x002E;&no-i18n-urlenc-3E; &no-i18n-unicode-0x0040;&no-i18n-urlenc-40; &no-i18n-unicode-0x007C;&no-i18n-urlenc-7C; &no-i18n-unicode-0x0027;&no-i18n-urlenc-27; &no-i18n-unicode-0x002F;&no-i18n-urlenc-2F; &no-i18n-unicode-0x005B;&no-i18n-urlenc-5B; &no-i18n-unicode-0x007D;&no-i18n-urlenc-7D; &no-i18n-unicode-0x007E;&no-i18n-urlenc-7E;
&kwave; Script Files General Structure A &kwave; script consists of a list of lines, where each line can be: a single command, a command list, with two or more commands concatenated by a ;. a comment, a label or an empty line, that contains white space only Comments and Empty Lines All characters that follow a # (except when used in quotes or when escaped) are treated as comments, they will be silently ignored. Lines that contain only white space or comments are ignored as well. Termination A &kwave; script terminates either when all commands have been executed successfully without an error or when a command has returned an error code. There is no special command for aborting the execution of a script. If you want to implement a possibility for the user to end a script, you can use the command msgbox(text). This shows a message box with the two buttons OK (which lets the script continue) and Cancel (which returns an error code and stops the script). Labels Lines that consist only of an identifier, followed by a : are treated labels. They can be referenced later in the script by the special keyword GOTO Note: Please don't mix up the keyword GOTO with the text command goto (position) ! , which makes the execution of the script continue at the location of that label (see example below). A line that contains a label must not contain any other content (except comments or white space) after the :. Example: start: # <= this is a label # do something... msgbox(once again?) GOTO start Command Reference Alphabetical Index &no-i18n-tag; a c d e f g i l m n o p q r s u v w &no-i18n-tag;a &no-i18n-cmd_about_kde; &i18n-cmd_syntax;<command>&no-i18n-tag;&no-i18n-cmd_about_kde;</command>() Shows a dialog window with information about the KDE version used by the computer &kwave; is running at. &no-i18n-cmd_add_track; &i18n-cmd_syntax;<command>&no-i18n-tag;&no-i18n-cmd_add_track;</command>() Adds a new track after all existing tracks. See also &no-i18n-tag;&no-i18n-cmd_insert_track;() &no-i18n-tag;c &no-i18n-cmd_clipboard_flush; &i18n-cmd_syntax;<command>&no-i18n-tag;&no-i18n-cmd_clipboard_flush;</command>() Discards the current content of the clipboard (might free some memory). &no-i18n-cmd_close; &i18n-cmd_syntax;<command>&no-i18n-tag;&no-i18n-cmd_close;</command>() Closes the current file. If the GUI is configured to MDI or Tab mode, this also closes the corresponding sub window. See also &no-i18n-tag;&no-i18n-cmd_open;(filename), &no-i18n-tag;&no-i18n-cmd_quit;() &no-i18n-cmd_continue; &i18n-cmd_syntax;<command>&no-i18n-tag;&no-i18n-cmd_continue;</command>() Corresponds to the Continue toolbar button and lets the playback continue if it is paused. See also &no-i18n-tag;&no-i18n-cmd_pause;() &no-i18n-cmd_copy; &i18n-cmd_syntax;<command>&no-i18n-tag;&no-i18n-cmd_copy;</command>() Copies the content of the current selection to the clipboard. If the selection is empty, this command does nothing and the content of the clipboard remains unchanged. Only the content of the currently selected tracks is copied to the clipboard! See also &no-i18n-tag;&no-i18n-cmd_paste;() &no-i18n-cmd_crop; &i18n-cmd_syntax;<command>&no-i18n-tag;&no-i18n-cmd_crop;</command>() Crops the signal to the current selection by deleting everything that is after and before the current selection. Affects all tracks. If nothing is selected this command does nothing. &no-i18n-cmd_cut; &i18n-cmd_syntax;<command>&no-i18n-tag;&no-i18n-cmd_cut;</command>() Copies the content of the current selection to the clipboard and removes it from the signal. If the selection is empty, this command does nothing and the content of the clipboard remains unchanged. Only the content of the currently selected tracks is copied to the clipboard, but the selected range is deleted from all tracks. &no-i18n-tag;d &no-i18n-cmd_delayed; &i18n-cmd_syntax;<command>&no-i18n-cmd_delayed;</command>( <replaceable>milliseconds</replaceable>, <replaceable>command</replaceable> ) Executes a command after a given delay. Please note that the command is executed asynchronously after the given time has elapsed. Multiple commands can be queued, where the delays are relative to the last queued command. This command is intended to be used for queuing commands when taking screenshots for documentation purposes. Parameters milliseconds: number of whole milliseconds to wait before executing the command command: a command, including parameters to be executed after the given delay See also &no-i18n-tag;&no-i18n-cmd_sync;(), &no-i18n-tag;&no-i18n-cmd_window_resize;(), &no-i18n-tag;&no-i18n-cmd_window_click;(), &no-i18n-tag;&no-i18n-cmd_window_sendkey;(), &no-i18n-tag;&no-i18n-cmd_window_close;(), &no-i18n-tag;&no-i18n-cmd_window_screenshot;() &no-i18n-cmd_delete; &i18n-cmd_syntax;<command>&no-i18n-tag;&no-i18n-cmd_delete;</command>() Deletes the currently selected range of samples. If the selection is empty, this command does nothing. Affects all tracks. &no-i18n-cmd_delete_track; &i18n-cmd_syntax;<command>&no-i18n-cmd_delete_track;</command>(<replaceable>index</replaceable>) Deletes a track, identified by its index (starting from zero). If no track with the given index exists, this command exits with an error. Parameters index:index of the track to delete, starting with 0 &no-i18n-cmd_dump_metadata; &i18n-cmd_syntax;<command>&no-i18n-tag;&no-i18n-cmd_dump_metadata;</command>() Prints a list of all meta data entries to the console, for diagnostic purposes. (Only available when &kwave; has been compiled with the option WITH_DEBUG switched on). &no-i18n-tag;e &no-i18n-cmd_expandtolabel; &i18n-cmd_syntax;<command>&no-i18n-tag;&no-i18n-cmd_expandtolabel;</command>() Expands the current selection to the labels left and right from the current selection borders. If the border of selection already is on a label, it stays unchanged. If there is no label left or right of the current selection, it will be expanded to the start or end of the file. &no-i18n-tag;f &no-i18n-cmd_fileinfo; &i18n-cmd_syntax;<command>&no-i18n-cmd_fileinfo;</command>(<replaceable>index</replaceable>) Set a file info entry to a new value. Parameters keyword:keyword of the entry value:value of the entry &no-i18n-cmd_forward; &i18n-cmd_syntax;<command>&no-i18n-tag;&no-i18n-cmd_forward;</command>() Corresponds to the Forward toolbar button. If the playback is currently running, it skips forward by 1/10 of the visible range. If the playback is not running, this does the same as the command &no-i18n-cmd_view_scroll_right;. See also &no-i18n-tag;&no-i18n-cmd_view_scroll_right;(), &no-i18n-tag;&no-i18n-cmd_rewind;() &no-i18n-tag;g &no-i18n-cmd_goto; &i18n-cmd_syntax;<command>&no-i18n-cmd_goto;</command>(<replaceable>pos</replaceable>) Sets the cursor to the given position and makes it visible in current view. After this the selection has zero length. Parameters pos:position in samples where to go to &no-i18n-tag;i &no-i18n-cmd_insert_at; &i18n-cmd_syntax;<command>&no-i18n-cmd_insert_at;</command>(<replaceable>pos</replaceable>) Inserts the content of the clipboard at the given position, like the command &no-i18n-cmd_paste;()(). If the clipboard is currently empty, this function does nothing. Parameters pos:position in samples where to insert See also &no-i18n-tag;&no-i18n-cmd_paste;() &no-i18n-cmd_insert_track; &i18n-cmd_syntax;<command>&no-i18n-cmd_insert_track;</command>(<replaceable>index</replaceable>) Inserts a new track at the given index, using the current length and sample rate settings of the signal. If the index is higher than or equal to the current number of tracks, it will be appended as the last track, same as by the command &no-i18n-cmd_add_track;(). The index of all existing tracks at and after the given index will be incremented by one. Parameters index:index of the track to insert, starting with 0 See also &no-i18n-tag;&no-i18n-cmd_add_track;() &no-i18n-tag;l &no-i18n-cmd_label_add; &i18n-cmd_syntax;<command>&no-i18n-cmd_label_add;</command>(<replaceable>pos</replaceable>[,<replaceable>text</replaceable>]) Add a new label at a given position. If the given position already contains a label, then this command does nothing. The label can be given an optional description. Parameters pos:position in samples where to insert the label text:some descriptive text (optional) &no-i18n-cmd_label_delete; &i18n-cmd_syntax;<command>&no-i18n-cmd_label_delete;</command>(<replaceable>index</replaceable>) Deletes a label, identified by its index (starting from zero), or all labels when using the special value -1 as index. If no label with the given index exists, this command does nothing. Parameters index:index of the label to delete, starting with 0 or -1 to delete all labels &no-i18n-cmd_label_edit; Screenshot Screenshot of the label editing dialog &i18n-cmd_syntax;<command>&no-i18n-cmd_label_edit;</command>(<replaceable>index</replaceable>) Opens a window in which the user can edit the position and the description of a label, which is identified by its index (starting from zero). If no label with the given index exists, this command does nothing. Parameters index:index of the label to edit, starting with 0 &no-i18n-cmd_loadbatch; &i18n-cmd_syntax;<command>&no-i18n-cmd_loadbatch;</command>(<replaceable>filename</replaceable>) Opens a &kwave; script file and processes the commands in it. Uses the context of the currently opened file or the current main window if no file is loaded. Parameters filename: name of the kwave script file including path and extension &no-i18n-cmd_loop; &i18n-cmd_syntax;<command>&no-i18n-tag;&no-i18n-cmd_loop;</command>() Corresponds to the Loop toolbar button. Starts the playback (if it is not already running) and lets it play in a loop. See also &no-i18n-tag;&no-i18n-cmd_playback_start;() &no-i18n-tag;m &no-i18n-cmd_menu; &i18n-cmd_syntax;<command>&no-i18n-cmd_menu;</command> (<replaceable>command</replaceable>, <replaceable>path</replaceable>, [<replaceable>hotkey</replaceable>], [<replaceable>id</replaceable>]) This is a very powerful command, which is used to add a new entry to the menu or to modify an existing entry. It determines which command is executed when the menu entry is activated, which icon is shown in the menu and which hotkey is used. Each menu entry can be disabled or hidden, can be assigned a unique id and can also join a menu group. You normally do not need this command within a &kwave; script! Parameters command: A text command (including parameters) or a command list that will be executed when the menu entry gets activated. If a menu entry does not have a corresponding command (for example if it is a sub menu and not menu entry), you should use the special command ignore(). path: The path within the menu, using a / as separator. The last part of the path can be a sub command which modifies some property of the menu entry (see below). The last portion of the path (that is not a sub command) produces a menu entry, the parts before produce the main menu entry or sub menus that lead to it. Main menu entries or sub menus are automatically created when a menu entry is created, you do not need them manually. hotkey: A bitmask that consists of a combination of predefined keys and modifiers, concatenated with a +. The key can be either a digit, an upper case letter, a function key (F1 ... F12) or any other key name understood by the Qt class QKeySequence, including key names for predefined actions (like for example ::Copy). Typical modifiers are SHIFT, ALT and CTRL. id: A unique id that can be internally used to identify this menu entry or menu / sub menu. Only uppercase letters, digits and _ should be used and it should start with ID_. It is in your own responsibility to make sure that the same id is not used twice. Sub Commands &no-i18n-tag;#checkable: Makes a menu entry checkable, so that it can be switched on or off. &no-i18n-tag;#disabled: Lets the menu entry or menu/sub menu be disabled. &no-i18n-tag;#enabled: Makes a menu entry or menu/sub menu that has been previously disabled enabled again. #exclusive(group): Makes a menu entry be part of an exclusive group (one of many selection). The group that is given as parameter should not be used for any other purpose. Only one entry within that group can be selected at a time. #group(list): Adds the menu entry or menu/sub menu to one or more a groups, so that the application can enable/disable a bunch of menu entries without need to know all their unique ids. Multiple groups can be passed as a list with a , as separator. Group names have to start with a @. The following groups predefined: &no-i18n-tag;@CLIPBOARD: Only enabled when the clipboard is not empty. &no-i18n-tag;@LABELS: Only enabled when the current signal contains at least one label. &no-i18n-tag;@NOT_CLOSED: Enabled when the current signal is not closed (the signal might be empty or zero length). &no-i18n-tag;@SELECTION: Enabled when the selection is not empty (more than one sample is selected). &no-i18n-tag;@SIGNAL: Enabled when there is some signal loaded and it is not empty or zero length. &no-i18n-tag;#hidden: Hides the menu entry or menu/sub menu. #icon(name): Assigns an icon to a menu entry. The icon name should correspond to an icon file (without path and file extension) that is installed with KDE or with &kwave;. #listmenu(id,command): Inserts a placeholder for a list of menu entries into a sub menu. The unique id specified in this sub command is used to add/remove or clear the list of menu entries. The command parameter has to contain %1 as parameter, which will be replaced with the text of the menu entry when it is activated. (This sub command is internally used for the list of recent files, list of tracks and window list). &no-i18n-tag;#separator: Inserts a separator into a sub menu. &no-i18n-cmd_msgbox; &i18n-cmd_syntax;<command>&no-i18n-cmd_msgbox;</command>(<replaceable>text</replaceable>) Shows a message box with some text and the two buttons OK (returns without error code) and Cancel (returns and error code). You can use this command to give the user a possibility to abort a running script. Parameters text: A message that will be shown in the message box, should contain a question that can be answered with OK or Cancel &no-i18n-tag;n &no-i18n-cmd_newsignal; &i18n-cmd_syntax;<command>&no-i18n-cmd_newsignal;</command>( <replaceable>samples</replaceable>, <replaceable>rate</replaceable>, <replaceable>bits</replaceable>, <replaceable>tracks</replaceable>) Creates a new signal, with a given length in samples, a rate in samples per second (floating point number), a number of bits per sample and number of tracks. You can calculate the length in samples by multiplying the desired length in seconds with the sample rate. Parameters samples: Length of the signal in samples. rate: Sample rate in samples per second. bits: Number of bits per sample, must not be zero, should be a number from 8...32. tracks: Number of tracks. &no-i18n-cmd_next; &i18n-cmd_syntax;<command>&no-i18n-tag;&no-i18n-cmd_next;</command>() Corresponds to the Next toolbar button. If the playback is currently running, it skips forward to the next label. If the playback is not running, this does the same as the command &no-i18n-cmd_view_scroll_next_label;. See also &no-i18n-tag;&no-i18n-cmd_view_scroll_next_label;(), &no-i18n-tag;&no-i18n-cmd_prev;() &no-i18n-tag;o &no-i18n-cmd_open; &i18n-cmd_syntax;<command>&no-i18n-cmd_open;</command>([<replaceable>filename</replaceable>]) Opens a file, which can be either a sound file or a &kwave; script. If no file name is passed, then a dialog window will be opened that allows to select an existing file. Depending on the GUI mode the file will be opened in the context of a new sub window (MDI and tab) or in a new main window (SDI, if there was already something loaded). Parameters filename: name of a file including path and extension See also &no-i18n-tag;&no-i18n-cmd_close;() &no-i18n-cmd_openrecent; &i18n-cmd_syntax;<command>&no-i18n-cmd_openrecent;</command>(<replaceable>filename</replaceable>) Practically the same as the command &no-i18n-cmd_open;, but intended to be used internally for the list of recently opened files in the menu FileOpen Recent . In this command the parameter filename is not optional. Parameters filename: entry of the list of recently opened files See also &no-i18n-tag;&no-i18n-cmd_open; &no-i18n-tag;p &no-i18n-cmd_paste; &i18n-cmd_syntax;<command>&no-i18n-tag;&no-i18n-cmd_paste;</command>() Replaces the current selection with the content of the clipboard. If the clipboard is empty, this command does nothing. The sample rate of the inserted data is adjusted to match the sample rate of the current signal if necessary. Only enabled tracks are affected, disabled tracks remain unchanged. Please be aware that this might produce a time shift between enabled and disabled tracks! If the number of tracks of the clipboard data differs from the number of enabled tracks, then the data is mixed to be spread equally over all selected tracks. See also &no-i18n-tag;&no-i18n-cmd_copy;() &no-i18n-cmd_pause; &i18n-cmd_syntax;<command>&no-i18n-tag;&no-i18n-cmd_continue;</command>() Corresponds to the Pause toolbar button and lets the playback pause if it is currently running, or continue if it is currently paused. See also &no-i18n-tag;&no-i18n-cmd_continue;() &no-i18n-cmd_playback_start; &i18n-cmd_syntax;<command>&no-i18n-tag;&no-i18n-cmd_playback_start;</command>() Corresponds to the Start toolbar button and lets the playback start if it is currently paused. &no-i18n-cmd_plugin; &i18n-cmd_syntax;<command>&no-i18n-cmd_plugin;</command>(<replaceable>name</replaceable>, [<replaceable>parameter</replaceable> ...]) Executes a plugin, with an optional list of parameters. If no parameter list is given, then the setup function of the plugin will be called, using the parameters of the previous invocation or default parameters as input (normally shows a setup dialog, depending on the plugin). Please refer to the chapter about plugins for a description of the various plugins. Parameters name: the (internal) name of a &kwave; plugin parameter: a list of parameters understood by the plugin (optional) See also &no-i18n-tag;&no-i18n-cmd_plugin_execute;(), &no-i18n-tag;&no-i18n-cmd_plugin_setup;() &no-i18n-cmd_plugin_execute; &i18n-cmd_syntax;<command>&no-i18n-cmd_plugin_execute;</command>(<replaceable>name</replaceable>, [<replaceable>parameter</replaceable> ...]) Similar to the command &no-i18n-cmd_plugin;(), but without calling the setup function of the plugin if no parameters were passed. Parameters name: the (internal) name of a &kwave; plugin parameter: a list of parameters understood by the plugin &no-i18n-cmd_plugin_setup; &i18n-cmd_syntax;<command>&no-i18n-cmd_plugin_setup;</command>(<replaceable>name</replaceable>, [<replaceable>parameter</replaceable> ...]) Calls the setup function of a plugin, with an optional list of parameters. If no parameter list is given, the parameters of the previous invocation or default parameters will be used as input. This normally shows a setup dialog, depending on the plugin. Please refer to the chapter about plugins for a description of the various plugins. Parameters name: the (internal) name of a &kwave; plugin parameter: a list of parameters understood by the plugin (optional) &no-i18n-cmd_prev; &i18n-cmd_syntax;<command>&no-i18n-tag;&no-i18n-cmd_prev;</command>() Corresponds to the Previous toolbar button. If the playback is currently running, it skips back to the previous label or start of the selection. If the playback is not running, this does the same as the command &no-i18n-cmd_view_scroll_prev_label;. See also &no-i18n-tag;&no-i18n-cmd_view_scroll_prev_label;(), &no-i18n-tag;&no-i18n-cmd_next;() &no-i18n-tag;q &no-i18n-cmd_quit; &i18n-cmd_syntax;<command>&no-i18n-tag;&no-i18n-cmd_quit;</command>() Closes the current main window, including all sub windows. In SDI mode this is the same as the command &no-i18n-cmd_close;(). See also &no-i18n-tag;&no-i18n-cmd_close;() &no-i18n-tag;r &no-i18n-cmd_redo; &i18n-cmd_syntax;<command>&no-i18n-tag;&no-i18n-cmd_redo;</command>() Corresponds to the Redo toolbar button and repeats one operation that has been reverted with &no-i18n-cmd_undo;. See also &no-i18n-tag;&no-i18n-cmd_undo;() &no-i18n-cmd_redo_all; &i18n-cmd_syntax;<command>&no-i18n-tag;&no-i18n-cmd_redo_all;</command>() Similar to &no-i18n-cmd_redo;, but re-does as many operations as possible. See also &no-i18n-tag;&no-i18n-cmd_undo;() &no-i18n-cmd_reenable_dna; &i18n-cmd_syntax;<command>&no-i18n-tag;&no-i18n-cmd_reenable_dna;</command>() Some message boxes offer the possibility to prevent them from appearing again (do not ask again). This command makes all of them appear again. &no-i18n-cmd_reset_toolbars; &i18n-cmd_syntax;<command>&no-i18n-tag;&no-i18n-cmd_reset_toolbars;</command>() Resets all toolbar settings, like location, icon size and text location back to defaults. &no-i18n-cmd_revert; &i18n-cmd_syntax;<command>&no-i18n-tag;&no-i18n-cmd_revert;</command>() Reverts the currently loaded file back to the last saved state, discarding all changes that are not saved. &no-i18n-cmd_rewind; &i18n-cmd_syntax;<command>&no-i18n-tag;&no-i18n-cmd_rewind;</command>() Corresponds to the Rewind toolbar button. If the playback is currently running, it skips backward by 1/10 of the visible range. If the playback is not running, this does the same as the command &no-i18n-cmd_view_scroll_left;. See also &no-i18n-tag;&no-i18n-cmd_view_scroll_left;(), &no-i18n-tag;&no-i18n-cmd_forward;() &no-i18n-tag;s &no-i18n-cmd_save; &i18n-cmd_syntax;<command>&no-i18n-tag;&no-i18n-cmd_save;</command>() Corresponds to the Save toolbar button. Saves the current file if it has modifications. If the file does not already have a name (⪚ a file that has just been created and does not yet have a file name), this command does the same as &no-i18n-cmd_saveas;. See also &no-i18n-tag;&no-i18n-cmd_saveas;() &no-i18n-cmd_saveas; &i18n-cmd_syntax;<command>&no-i18n-cmd_saveas;</command>([<replaceable>filename</replaceable>]) Saves the currently opened file under a given file name. If no file name is given as parameter, a dialog will be shown to select the directory and to enter a file name. Parameters filename: file name for saving (optional) &no-i18n-cmd_saveselect; &i18n-cmd_syntax;<command>&no-i18n-tag;&no-i18n-cmd_saveselect;</command>() This command does the same as &no-i18n-cmd_save;, but saves only the currently selected range and the activated tracks instead of the whole file. See also &no-i18n-tag;&no-i18n-cmd_save;() &no-i18n-cmd_select_gui_type; &i18n-cmd_syntax;<command>&no-i18n-cmd_select_gui_type;</command>(mode) Select a GUI mode, which can be either SDI, MDI or Tab mode. Please be aware that this changes will immediately take effect! Parameters filename: name of the mode, must be either SDI, MDI or TAB. &no-i18n-cmd_select_track_all; &i18n-cmd_syntax;<command>&no-i18n-tag;&no-i18n-cmd_select_track_all;</command>() Mark all tracks enabled. This is the same as calling the command &no-i18n-tag;&no-i18n-cmd_select_track_on;() for all existing tracks. See also &no-i18n-tag;&no-i18n-cmd_select_track_on;() &no-i18n-cmd_select_track_invert; &i18n-cmd_syntax;<command>&no-i18n-tag;&no-i18n-cmd_select_track_all;</command>() Invert the enabled state of all tracks. This is the same as calling the command &no-i18n-cmd_select_track_toggle;() for all existing tracks. See also &no-i18n-tag;&no-i18n-cmd_select_track_toggle;() &no-i18n-cmd_select_track_none; &i18n-cmd_syntax;<command>&no-i18n-tag;&no-i18n-cmd_select_track_none;</command>() Mark all tracks disabled. This is the same as calling the command &no-i18n-cmd_select_track_off;() for all existing tracks. See also &no-i18n-tag;&no-i18n-cmd_select_track_off;() &no-i18n-cmd_select_track_off; &i18n-cmd_syntax;<command>&no-i18n-cmd_select_track_off;</command>(index) Disables a single track, so that it does not get affected by most operations. Parameters index: index of the track, starting with zero &no-i18n-cmd_select_track_on; &i18n-cmd_syntax;<command>&no-i18n-cmd_select_track_on;</command>(index) Enables a single track, so that it gets affected by all operations. Parameters index: index of the track, starting with zero &no-i18n-cmd_select_track_toggle; &i18n-cmd_syntax;<command>&no-i18n-cmd_select_track_toggle;</command>(index) Enables a track if it is currently disabled, or disables it if it is currently enabled. Parameters index: index of the track, starting with zero &no-i18n-cmd_selectall; &i18n-cmd_syntax;<command>&no-i18n-tag;&no-i18n-cmd_selectall;</command>() Selects the range of the whole signal, from the first to the last sample. &no-i18n-cmd_selectnext; &i18n-cmd_syntax;<command>&no-i18n-tag;&no-i18n-cmd_selectnext;</command>() Selects a range of samples that starts right after the current selection, using the same length as the current selection. The selection is automatically clipped to the end of the signal. For example: if you have selected samples 1000 ... 1019, then the result will be a selection from sample 1020 ... 1039. See also &no-i18n-tag;&no-i18n-cmd_selectprev;() &no-i18n-cmd_selectnextlabels; &i18n-cmd_syntax;<command>&no-i18n-tag;&no-i18n-cmd_selectnextlabels;</command>() Selects a range of samples between the next two labels after the current selection. If nothing is selected, it selects from the start of the signal up to the first label. Otherwise the left border of the new selection will be the position of first label after the selection (or the last label if there are no more labels right from the selection), and the right border of the new selection will be the first label after the left border of the new selection (or the end of the signal if there is none). This command returns an error when there are no labels at all. See also &no-i18n-tag;&no-i18n-cmd_selectprevlabels;() &no-i18n-cmd_selectnone; &i18n-cmd_syntax;<command>&no-i18n-tag;&no-i18n-cmd_selectnone;</command>() Resets the selection to zero length. &no-i18n-cmd_selectprev; &i18n-cmd_syntax;<command>&no-i18n-tag;&no-i18n-cmd_selectprev;</command>() Selects a range of samples that starts left from the current selection, using the same length as the current selection. The selection is automatically clipped to the start of the signal. For example: if you have selected samples 1000 ... 1019, then the result will be a selection from sample 980 ... 999. See also &no-i18n-tag;&no-i18n-cmd_selectnext;() &no-i18n-cmd_selectprevlabels; &i18n-cmd_syntax;<command>&no-i18n-tag;&no-i18n-cmd_selectprevlabels;</command>() Selects a range of samples between the previous two labels before the current selection. If nothing is selected, it selects from the start of the signal up to the first label. Otherwise the right border of the new selection will be the position of first label before the selection (or the first label if there are no more labels left from the selection), and the left border of the new selection will be the first label before the right border of the new selection (or the start of the signal if there is none). This command returns an error when there are no labels at all. See also &no-i18n-tag;&no-i18n-cmd_selectnextlabels;() &no-i18n-cmd_selecttoleft; &i18n-cmd_syntax;<command>&no-i18n-tag;&no-i18n-cmd_selecttoleft;</command>() Sets the start of the selection to the start of the signal, the end of the current selection stays unchanged. See also &no-i18n-tag;&no-i18n-cmd_selecttoright;() &no-i18n-cmd_selecttoright; &i18n-cmd_syntax;<command>&no-i18n-tag;&no-i18n-cmd_selecttoright;</command>() Sets the end of the selection to the end of the signal, the start of the current selection stays unchanged. See also &no-i18n-tag;&no-i18n-cmd_selecttoleft;() &no-i18n-cmd_selectvisible; &i18n-cmd_syntax;<command>&no-i18n-tag;&no-i18n-cmd_selectvisible;</command>() Selects the range of samples that is visible in the current window. &no-i18n-cmd_start; &i18n-cmd_syntax;<command>&no-i18n-tag;&no-i18n-cmd_start;</command>() Corresponds to the Start toolbar button and lets the playback start from the beginning of the selection or continue if it is currently paused. See also &no-i18n-tag;&no-i18n-cmd_stop;() &no-i18n-cmd_stop; &i18n-cmd_syntax;<command>&no-i18n-tag;&no-i18n-cmd_stop;</command>() Corresponds to the Stop toolbar button and lets the playback stop if it is currently running. See also &no-i18n-tag;&no-i18n-cmd_start;() &no-i18n-cmd_sync; &i18n-cmd_syntax;<command>&no-i18n-tag;&no-i18n-cmd_sync;</command>() Waits until all commands which have been started asynchronously have finished. If nothing is currently queued for delayed execution this command has no effect. See also &no-i18n-tag;&no-i18n-cmd_delayed;() &no-i18n-tag;u &no-i18n-cmd_undo; &i18n-cmd_syntax;<command>&no-i18n-tag;&no-i18n-cmd_undo;</command>() Corresponds to the Undo toolbar button and reverts the last operation. See also &no-i18n-tag;&no-i18n-cmd_redo;() &no-i18n-cmd_undo_all; &i18n-cmd_syntax;<command>&no-i18n-tag;&no-i18n-cmd_undo_all;</command>() Similar to &no-i18n-tag;&no-i18n-cmd_undo;, but reverts as many operations as possible. See also &no-i18n-tag;&no-i18n-cmd_undo;() &no-i18n-tag;v &no-i18n-cmd_view_scroll_end; &i18n-cmd_syntax;<command>&no-i18n-tag;&no-i18n-cmd_view_scroll_end;</command>() Scrolls the current view to the end of the signal. See also &no-i18n-tag;&no-i18n-cmd_view_scroll_start;() &no-i18n-cmd_view_scroll_left; &i18n-cmd_syntax;<command>&no-i18n-tag;&no-i18n-cmd_view_scroll_left;</command>() Scrolls the current view by 1/10 of the currently visible range towards the start of the signal. If the start of the signal is reached the visible area starts at offset zero. See also &no-i18n-tag;&no-i18n-cmd_view_scroll_right;() &no-i18n-cmd_view_scroll_next; &i18n-cmd_syntax;<command>&no-i18n-tag;&no-i18n-cmd_view_scroll_next;</command>() Scrolls the current view towards the end of the signal by the currently visible range. See also &no-i18n-tag;&no-i18n-cmd_view_scroll_prev;() &no-i18n-cmd_view_scroll_next_label; &i18n-cmd_syntax;<command>&no-i18n-tag;&no-i18n-cmd_view_scroll_next_label;</command>() Scrolls right and tries to show the next label centered in the view. If there was no label right from the current position, it will scroll to the end of the signal. See also &no-i18n-tag;&no-i18n-cmd_view_scroll_prev_label;() &no-i18n-cmd_view_scroll_prev; &i18n-cmd_syntax;<command>&no-i18n-tag;&no-i18n-cmd_view_scroll_prev;</command>() Scrolls the current view towards the start of the signal by the currently visible range. See also &no-i18n-tag;&no-i18n-cmd_view_scroll_next;() &no-i18n-cmd_view_scroll_prev_label; &i18n-cmd_syntax;<command>&no-i18n-tag;&no-i18n-cmd_view_scroll_prev_label;</command>() Scrolls left and tries to show the previous label centered in the view. If there was no label left from the current position, it will scroll to the start of the signal. See also &no-i18n-tag;&no-i18n-cmd_view_scroll_next_label;() &no-i18n-cmd_view_scroll_right; &i18n-cmd_syntax;<command>&no-i18n-tag;&no-i18n-cmd_view_scroll_right;</command>() Scrolls the current view by 1/10 of the currently visible range towards the end of the signal. If the end of the signal is reached the visible area ends at the end of the signal. See also &no-i18n-tag;&no-i18n-cmd_view_scroll_left;() &no-i18n-cmd_view_scroll_start; &i18n-cmd_syntax;<command>&no-i18n-tag;&no-i18n-cmd_view_scroll_start;</command>() Scrolls the current view to the start of the signal. See also &no-i18n-tag;&no-i18n-cmd_view_scroll_end;() &no-i18n-cmd_view_zoom_all; &i18n-cmd_syntax;<command>&no-i18n-tag;&no-i18n-cmd_view_zoom_all;</command>() Adjusts the zoom factor so that the complete signal is visible in the current view. &no-i18n-cmd_view_zoom_in; &i18n-cmd_syntax;<command>&no-i18n-cmd_view_zoom_in;</command>([<replaceable>position</replaceable>]) Reduces the zoom factor (in samples per pixel) by 30%, so that more details get visible. If a position is given, it tries to show that position centered in the current view, otherwise the center of the view before the zoom change is used for centering. The minimum zoom factor is limited to a minimum of five samples per width of the view. Parameters position: a zero based position in samples to center the view (optional) See also &no-i18n-tag;&no-i18n-cmd_view_zoom_out;() &no-i18n-cmd_view_zoom_normal; &i18n-cmd_syntax;<command>&no-i18n-tag;&no-i18n-cmd_view_zoom_normal;</command>() Sets the zoom factor to one pixel per sample (factor 1.0) and tries to keep the previous center of the view. &no-i18n-cmd_view_zoom_out; &i18n-cmd_syntax;<command>&no-i18n-cmd_view_zoom_out;([<replaceable>position</replaceable>])</command> Increases the zoom factor (in samples per pixel) by 30%, so that less details get visible. If a position is given, it tries to show that position centered in the current view, otherwise the center of the view before the zoom change is used for centering. The maximum zoom factor is limited to the number of samples of the complete signal and the width of the view. Parameters position: a zero based position is samples to center the view (optional) See also &no-i18n-tag;&no-i18n-cmd_view_zoom_in;() &no-i18n-cmd_view_zoom_selection; &i18n-cmd_syntax;<command>&no-i18n-tag;&no-i18n-cmd_view_zoom_selection;</command>() Adjusts the view (zoom factor and start of visible area) so that it matches the current selection. This command does nothing if the selection is empty. &no-i18n-tag;w &no-i18n-cmd_window_activate; &i18n-cmd_syntax;<command>&no-i18n-cmd_window_activate;</command>(<replaceable>title</replaceable>]) Activates a sub window, identified by its window title. If the sub window is minimized it will be restored. Only available if in MDI and tab mode. This command is internally used by the Window menu. Parameters title: the title of the sub window that should be activated &no-i18n-cmd_window_cascade; &i18n-cmd_syntax;<command>&no-i18n-tag;&no-i18n-cmd_window_cascade;</command>() Cascades all sub windows when in MDI mode. All sub windows that are currently minimized stay minimized, they will not be restored. &no-i18n-cmd_window_click; &i18n-cmd_syntax;<command>&no-i18n-cmd_window_click;</command>( <replaceable>class</replaceable>, <replaceable>x</replaceable>, <replaceable>y</replaceable> ) Sends a mouse click event to window, identified by its class name. The event will only be sent to the first window that has the given class name, therefore you should make sure that you have only one instance of the given window when this command gets executed. Parameters class: name of the window class x: x position, relative to the left border of the window (in pixels) y: y position, relative to the top border of the window (in pixels) &no-i18n-cmd_window_close; &i18n-cmd_syntax;<command>&no-i18n-cmd_window_close;</command>( <replaceable>class</replaceable> ) Closes a window, identified by its class name. Only the first window that has the given class name will be closed, therefore you should make sure that you have only one instance of the given window when this command gets executed. Parameters class: name of the window class &no-i18n-cmd_window_minimize; &i18n-cmd_syntax;<command>&no-i18n-cmd_window_minimize;</command> Minimizes the currently active sub window when in MDI mode or the current toplevel window when in SDI or Tab mode. &no-i18n-cmd_window_mousemove; &i18n-cmd_syntax;<command>&no-i18n-cmd_window_resize;</command>( <replaceable>class</replaceable>, <replaceable>x</replaceable>, <replaceable>y</replaceable> ) Sends a mouse move event to window, identified by its class name. The event will only be sent to the first window that has the given class name, therefore you should make sure that you have only one instance of the given window when this command gets executed. Parameters class: name of the window class x: x position, relative to the left border of the window (in pixels) y: y position, relative to the top border of the window (in pixels) &no-i18n-cmd_window_next_sub; &i18n-cmd_syntax;<command>&no-i18n-tag;&no-i18n-cmd_window_next_sub;</command>() Activates the next sub window when in MDI or tab mode. If the next sub window is minimized it will be restored. &no-i18n-cmd_window_prev_sub; &i18n-cmd_syntax;<command>&no-i18n-tag;&no-i18n-cmd_window_prev_sub;</command>() Activates the previous sub window when in MDI or tab mode. If the previous sub window is minimized it will be restored. &no-i18n-cmd_window_resize; &i18n-cmd_syntax;<command>&no-i18n-cmd_window_resize;</command>( <replaceable>class</replaceable>, <replaceable>width</replaceable>, <replaceable>height</replaceable> ) Changes the size of a window, identified by its class name to a new width and height. The change will only be applied to the first window that has the given class name, therefore you should make sure that you have only one instance of the given window when this command gets executed. Parameters class: name of the window class width: new width of the window (in pixels) height: new height of the window (in pixels) &no-i18n-cmd_window_screenshot; &i18n-cmd_syntax;<command>&no-i18n-cmd_window_screenshot;</command>( <replaceable>class</replaceable>, <replaceable>filename</replaceable> ) Takes a screenshot of a window, identified by its class and saves it to a file. The screenshot will be taken from the first window that has the given class name, therefore you should make sure that you have only one instance of the given window when this command gets executed. Currently the format of the file is hardcoded and has to be *.png. Parameters class: name of the window class filename: name of the file to save the screenshot, must have the extension *.png &no-i18n-cmd_window_sendkey; &i18n-cmd_syntax;<command>&no-i18n-cmd_window_sendkey;</command>( <replaceable>class</replaceable>, <replaceable>key code</replaceable> ) Sends a key press and release event to a window, identified by its class name. The key will only be sent to the first window that has the given class name, therefore you should make sure that you have only one instance of the given window when this command gets executed. Parameters class: name of the window class key code: the key code that should be sent, using the same syntax as used for setting up menus See also description of the parameter hotkey of the &no-i18n-cmd_menu; command. &no-i18n-cmd_window_tile; &i18n-cmd_syntax;<command>&no-i18n-tag;&no-i18n-cmd_window_tile;</command>() Tiles all sub windows when in MDI mode, using some scheme of KDE. All sub windows that are currently minimized stay minimized, they will not be restored. &no-i18n-cmd_window_tile_vertical; &i18n-cmd_syntax;<command>&no-i18n-tag;&no-i18n-cmd_window_tile_vertical;</command>() Tiles all sub windows vertically when in MDI mode. All windows that are currently minimized stay minimized, they will not be restored.
Plugins Plugin Reference Alphabetical Index &no-i18n-tag; a b c d + e + + f g i l m n p r s v z &no-i18n-plugin_about; (About Kwave) Screenshot Screenshot of the About Kwave Plugin &i18n-plugin_lbl_internal_name; &no-i18n-plugin_about; &i18n-plugin_lbl_type; gui &i18n-plugin_lbl_description; Shows a window with multiple tabs, including the following information: general information about the program authors, contributors and copyright holders all found plugins including their versions and authors information about the translation team copyright and licensing information &no-i18n-plugin_amplifyfree; (Amplify Free) Screenshot Screenshot of the Amplify Free Plugin &i18n-plugin_lbl_internal_name; amplifyfree &i18n-plugin_lbl_type; effect &i18n-plugin_lbl_description; Amplifies the current selection with a curve that consists of a set of coordinates and an interpolation method. The coordinates on the time axis as well as on the amplitude axis must be normed between 0.0 and 1.0. Parameters operation Internal name, for undo/redo handling. Possible values are: keyword description &no-i18n-tag;fade in fade in, curve from 0.0/0.0 to 1.0/1.0 &no-i18n-tag;fade out fade out, curve from 0.0/1.0 to 1.0/0.0 &no-i18n-tag;fade intro fade intro, one second pause, then fade in &no-i18n-tag;fade outro fade outro, first fade out, then one second pause &no-i18n-tag;amplify free user defined curve interpolation Interpolation type, possible values are: keyword description &no-i18n-tag;linear Linear &no-i18n-tag;spline Spline &no-i18n-tag;n-polynom Polynom, nth Degree &no-i18n-tag;3-polynom Polynom, 3rd Degree &no-i18n-tag;5-polynom Polynom, 5th Degree &no-i18n-tag;7-polynom Polynom, 7th Degree &no-i18n-tag;sample_hold Sample and Hold curve A comma separated list of pairs of coordinates, normed between 0.0 and 1.0, must be sorted by time axis (ascending), should start at time 0.0 and end with time 1.0. &no-i18n-plugin_band_pass; (Band Pass Filter) Screenshot Screenshot of the Band Pass Filter Plugin &i18n-plugin_lbl_internal_name; &no-i18n-plugin_band_pass; &i18n-plugin_lbl_type; effect &i18n-plugin_lbl_description; Applies a simple band pass filter to the current selection. A band pass lets a certain range of frequencies around a center frequency pass and filters out frequencies that are below or above the center frequency by more than half of the bandwidth of the filter. The filter has grade two and is implemented as described in the book "An introduction to digital filter theory" by Julius O. Smith and in Moore's book, where the normalized version from Moore's book is used. &i18n-plugin_lbl_parameters; frequency Center frequency of the filter in Hz, must be below half of the sample rate of the file. bandwidth Bandwidth of the filter in Hz. &no-i18n-plugin_codec_ascii; (ASCII Codec) &i18n-plugin_lbl_internal_name; &no-i18n-plugin_codec_ascii; &i18n-plugin_lbl_type; codec &i18n-plugin_lbl_file_types; &i18n-plugin-lbl_file_type_description; ASCII encoded audio &i18n-plugin-lbl_file_type_extensions; *.ascii &i18n-plugin-lbl_file_type_mime_types; audio/x-audio-ascii &i18n-plugin_lbl_meta_data; (all known file info items, see section ) &no-i18n-plugin_codec_audiofile; (Audiofile Codec) &i18n-plugin_lbl_internal_name; &no-i18n-plugin_codec_audiofile; &i18n-plugin_lbl_type; codec [import only] &i18n-plugin_lbl_file_types; &i18n-plugin-lbl_file_type_description; Amiga IFF/8SVX Sound File Format &i18n-plugin-lbl_file_type_extensions; *.8svx *.iff &i18n-plugin-lbl_file_type_mime_types; audio/x-8svx &i18n-plugin-lbl_file_type_description; NeXT, Sun Audio &i18n-plugin-lbl_file_type_extensions; *.au, *.snd &i18n-plugin-lbl_file_type_mime_types; audio/basic &i18n-plugin-lbl_file_type_description; Compressed Audio Interchange Format &i18n-plugin-lbl_file_type_extensions; *.aifc &i18n-plugin-lbl_file_type_mime_types; audio/x-aifc &i18n-plugin-lbl_file_type_description; Audio Interchange Format &i18n-plugin-lbl_file_type_extensions; *.aif, *.aiff &i18n-plugin-lbl_file_type_mime_types; audio/x-aiff &i18n-plugin-lbl_file_type_description; Audio Visual Research File Format &i18n-plugin-lbl_file_type_extensions; *.avr &i18n-plugin-lbl_file_type_mime_types; audio/x-avr &i18n-plugin-lbl_file_type_description; Core Audio File Format &i18n-plugin-lbl_file_type_extensions; *.caf &i18n-plugin-lbl_file_type_mime_types; audio/x-caf &i18n-plugin-lbl_file_type_description; Berkeley, IRCAM, Carl Sound Format &i18n-plugin-lbl_file_type_extensions; *.sf &i18n-plugin-lbl_file_type_mime_types; audio/x-ircam &i18n-plugin-lbl_file_type_description; NIST SPHERE Audio File Format &i18n-plugin-lbl_file_type_extensions; *.nist &i18n-plugin-lbl_file_type_mime_types; audio/x-nist &i18n-plugin-lbl_file_type_description; Sample Vision Format &i18n-plugin-lbl_file_type_extensions; *.smp &i18n-plugin-lbl_file_type_mime_types; audio/x-smp &i18n-plugin-lbl_file_type_description; Creative Voice &i18n-plugin-lbl_file_type_extensions; *.voc &i18n-plugin-lbl_file_type_mime_types; audio/x-voc &i18n-plugin_lbl_meta_data; (none) &no-i18n-plugin_codec_flac; (FLAC Codec) &i18n-plugin_lbl_internal_name; &no-i18n-plugin_codec_flac; &i18n-plugin_lbl_type; codec &i18n-plugin_lbl_file_types; &i18n-plugin-lbl_file_type_description; FLAC audio (Free Lossles Audio Codec) &i18n-plugin-lbl_file_type_extensions; *.flac &i18n-plugin-lbl_file_type_mime_types; audio/x-flac &i18n-plugin_lbl_meta_data; &i18n-INF_CREATION_DATE;, &i18n-INF_NAME;, &i18n-INF_VERSION;, &i18n-INF_ALBUM;, &i18n-INF_TRACK;, &i18n-INF_AUTHOR;, &i18n-INF_PERFORMER;, &i18n-INF_COPYRIGHT;, &i18n-INF_LICENSE;, &i18n-INF_ORGANIZATION;, &i18n-INF_SUBJECT;, &i18n-INF_GENRE;, &i18n-INF_SOURCE;, &i18n-INF_CONTACT;, &i18n-INF_ISRC;, &i18n-INF_SOFTWARE;, &i18n-INF_ENGINEER;, &i18n-INF_VBR_QUALITY; &no-i18n-plugin_codec_mp3; (MP3 Codec) Screenshot Screenshot of the MP3 Codec Setup Dialog &i18n-plugin_lbl_internal_name; &no-i18n-plugin_codec_mp3; &i18n-plugin_lbl_type; codec &i18n-plugin_lbl_file_types; &i18n-plugin-lbl_file_type_description; MPEG layer III audio &i18n-plugin-lbl_file_type_extensions; *.mp3 &i18n-plugin-lbl_file_type_mime_types; audio/x-mp3, audio/mpegs &i18n-plugin-lbl_file_type_description; MPEG layer II audio &i18n-plugin-lbl_file_type_extensions; *.mp2 &i18n-plugin-lbl_file_type_mime_types; audio/x-mp2, audio/mpeg &i18n-plugin-lbl_file_type_description; MPEG layer I audio &i18n-plugin-lbl_file_type_extensions; *.mp1, *.mpg, *.mpga &i18n-plugin-lbl_file_type_mime_types; audio/x-mpga, audio/mpeg &i18n-plugin_lbl_meta_data; &i18n-INF_ALBUM;, &i18n-INF_ANNOTATION;, &i18n-INF_AUTHOR;, &i18n-INF_CD;, &i18n-INF_CDS;, &i18n-INF_COMMENTS;, &i18n-INF_COMMISSIONED;, &i18n-INF_CONTACT;, &i18n-INF_COPYRIGHT;, &i18n-INF_CREATION_DATE;, &i18n-INF_GENRE;, &i18n-INF_ISRC;, &i18n-INF_LENGTH;, &i18n-INF_LICENSE;, &i18n-INF_MEDIUM;, &i18n-INF_NAME;, &i18n-INF_ORGANIZATION;, &i18n-INF_PERFORMER;, &i18n-INF_SOFTWARE;, &i18n-INF_TECHNICAN;, &i18n-INF_TRACK;, &i18n-INF_TRACKS;, &i18n-INF_VERSION; &no-i18n-plugin_codec_ogg; (Ogg Codec) &i18n-plugin_lbl_internal_name; &no-i18n-plugin_codec_ogg; &i18n-plugin_lbl_type; codec &i18n-plugin_lbl_file_types; &i18n-plugin-lbl_file_type_description; Ogg Opus audio &i18n-plugin-lbl_file_type_extensions; *.opus &i18n-plugin-lbl_file_type_mime_types; audio/ogg, application/ogg, audio/opus &i18n-plugin-lbl_file_type_description; Ogg Vorbis audio &i18n-plugin-lbl_file_type_extensions; *.ogg &i18n-plugin-lbl_file_type_mime_types; audio/ogg, audio/x-ogg, application/x-ogg, audio/x-vorbis+ogg &i18n-plugin_lbl_meta_data; &i18n-INF_ALBUM;, &i18n-INF_AUTHOR;, &i18n-INF_CONTACT;, &i18n-INF_COPYRIGHT;, &i18n-INF_CREATION_DATE;, &i18n-INF_ENGINEER;, &i18n-INF_GENRE;, &i18n-INF_ISRC;, &i18n-INF_LICENSE;, &i18n-INF_NAME;, &i18n-INF_ORGANIZATION;, &i18n-INF_PERFORMER;, &i18n-INF_SOFTWARE;, &i18n-INF_SOURCE;, &i18n-INF_SUBJECT;, &i18n-INF_TRACK;, &i18n-INF_VBR_QUALITY;, &i18n-INF_VERSION;, &no-i18n-plugin_codec_wav; (WAV Codec) &i18n-plugin_lbl_internal_name; &no-i18n-plugin_codec_wav; &i18n-plugin_lbl_type; codec &i18n-plugin_lbl_file_types; &i18n-plugin-lbl_file_type_description; WAV audio &i18n-plugin-lbl_file_type_extensions; *.wav &i18n-plugin-lbl_file_type_mime_types; audio/x-wav, audio/vnd.wave, audio/wav &i18n-plugin_lbl_meta_data; &i18n-INF_ALBUM;, &i18n-INF_ANNOTATION;, &i18n-INF_ARCHIVAL;, &i18n-INF_AUTHOR;, &i18n-INF_CD;, &i18n-INF_COMMENTS;, &i18n-INF_COMMISSIONED;, &i18n-INF_CONTACT;, &i18n-INF_COPYRIGHT;, &i18n-INF_CREATION_DATE;, &i18n-INF_ENGINEER;, &i18n-INF_GENRE;, &i18n-INF_ISRC;, &i18n-INF_KEYWORDS;, &i18n-INF_LICENSE;, &i18n-INF_MEDIUM;, &i18n-INF_NAME;, &i18n-INF_ORGANIZATION;, &i18n-INF_PERFORMER;, &i18n-INF_PRODUCT;, &i18n-INF_SOFTWARE;, &i18n-INF_SOURCE;, &i18n-INF_SOURCE_FORM;, &i18n-INF_SUBJECT;, &i18n-INF_TECHNICAN;, &i18n-INF_TRACK;, &i18n-INF_VERSION;, &no-i18n-plugin_debug; (Debug Functions) &i18n-plugin_lbl_internal_name; &no-i18n-plugin_debug; &i18n-plugin_lbl_type; function &i18n-plugin_lbl_description; Provides various internal commands useful for debugging and scripting &kwave;. These functions are only available through the main menu if &kwave; has been compiled in debug mode (built with the option CMAKE_WITH_DEBUG). &i18n-plugin_lbl_commands; , , , , + + &no-i18n-plugin_export_k3b; (Export to K3B Project) + + Screenshot + + + + + + Screenshot of the K3B Export Plugin + + + + + + &i18n-plugin_lbl_internal_name; + &no-i18n-plugin_export_k3b; + + + &i18n-plugin_lbl_type; + function + + + &i18n-plugin_lbl_description; + + + Saves all sections between markers into a separate file and creates + a K3B project file. After having successfully written all files it + is possible to start K3B and + burn the result to an audio CD. + This is useful for splitting a file with a recording that consists + of several parts, which are separated by labels, and then burn it + to an audio CD with multiple tracks, including CD text meta data + which is extracted from the descriptions of the labels. + + + (This plugin is internally using the + + plugin.) + + + + + &i18n-plugin_lbl_parameters; + + + + filename + + + The name of the K3B project file, will be used as + base name for the exported file names. + + + + + + pattern + + + A pattern that will be used for detecting + title and artist from the label at the start + of a section. + It supports the following wildcards which + will be replaced by the corresponding content + when creating the CD text meta data: + + + + + + wildcard + description + + + + + &no-i18n-tag;[%artist] + + Will be replaced with the artist that performed + the corresponding block or alternatively the author. + + + + &no-i18n-tag;[%title] + + Will be replaced with the title of the block, which is taken + from the descriptive text of the label at the + start of the block. + If that text is empty it will fall back to the title + of the file (see file information item + "Name"). + If this also does not exist, it will fall back to the + base file name as described above. + + + + + + + Example: [%title] ([%artist]) + will detect author Beethoven and title + Symphony No. 5 from the string + Symphony No. 5 (Beethoven). + + + + + + selection only + + + + + + + value + description + + + + + &no-i18n-tag;0 + + Save all sections of the whole file. + + + + &no-i18n-tag;1 + + Save only the sections that are within the + current selection. If nothing is selected, + the whole file will be saved. + + + + + + + + + + + export location + + + Determines where the blocks should be saved. + + + + + value + description + + + + + &no-i18n-tag;0 + + Save to the same directory as the + K3B project file. + + + + &no-i18n-tag;1 + + Save into a sub directory of the directory + of the K3B project file, using the K3B + project file name as base and appending + .dir. + + + + + + + + + + + overwrite policy + + + Determines where the numbering should start. + + + + + value + description + + + + + &no-i18n-tag;0 + + Always start with index 1, with the risk + of overwriting existing files. + + + + &no-i18n-tag;1 + + Continue after the index of the highest + index that already exists, this avoids + overwriting existing files. + + + + + + + + + + + + + + + &no-i18n-plugin_fileinfo; (File Info) Screenshot Screenshot of the File Info Plugin &i18n-plugin_lbl_internal_name; &no-i18n-plugin_fileinfo; &i18n-plugin_lbl_type; gui &i18n-plugin_lbl_description; Provides a dialog window to view and change parameters and meta data of the currently opened file. See section in this manual. &no-i18n-plugin_goto; (Goto Position) Screenshot Screenshot of the Goto Position Plugin &i18n-plugin_lbl_internal_name; &no-i18n-plugin_goto; &i18n-plugin_lbl_type; function &i18n-plugin_lbl_description; Shows a dialog with the possibility to set the current position of the selection to a new value, either by a time in milliseconds, by a position in samples or by percentage of the length of the current file. &i18n-plugin_lbl_commands; &i18n-plugin_lbl_parameters; mode value description &no-i18n-tag;0 position is given in milliseconds &no-i18n-tag;1 position is given in samples &no-i18n-tag;2 position is given in percentage of the file length position position to go to, in milliseconds, samples or percentage of the length of the file, depending on the parameter mode. &no-i18n-plugin_insert_at; (Insert At) Screenshot Screenshot of the Insert At Plugin &i18n-plugin_lbl_internal_name; &no-i18n-plugin_insert_at; &i18n-plugin_lbl_type; function &i18n-plugin_lbl_description; Similar to the plugin, but shows a dialog with the possibility to insert the current content of the clipboard at a given position, either by a time in milliseconds, by a position in samples or by percentage of the length of the current file. &i18n-plugin_lbl_commands; &i18n-plugin_lbl_parameters; mode value description &no-i18n-tag;0 position is given in milliseconds &no-i18n-tag;1 position is given in samples &no-i18n-tag;2 position is given in percentage of the file length position position where to insert the clipboard data, in milliseconds, samples or percentage of the length of the file, depending on the parameter mode. &no-i18n-plugin_lowpass; (Low Pass Filter) Screenshot Screenshot of the Low Pass Filter Plugin &i18n-plugin_lbl_internal_name; &no-i18n-plugin_lowpass; &i18n-plugin_lbl_type; effect &i18n-plugin_lbl_description; Applies a simple low pass filter to the current selection. A low pass filter lets frequencies below a border frequency pass and filters out frequencies that are above the border frequency. The filter has grade two and is implemented as described in the book "The manifold joys of conformal mapping, applications to digital filtering in the studio by James A. Moorer (JAES, Vol. 31, No. 11, 1983 November). &i18n-plugin_lbl_parameters; frequency The border frequency of the low pass filter in Hz. &no-i18n-plugin_memory; (Memory Settings) Screenshot Screenshot of the Memory Setup Plugin &i18n-plugin_lbl_internal_name; &no-i18n-plugin_memory; &i18n-plugin_lbl_type; gui &i18n-plugin_lbl_description; Provides a dialog to set up the memory usage of &kwave;. Please refer to the section about the in this manual for more information. &i18n-plugin_lbl_parameters; physical limited If zero, the use of physical memory will not limited, otherwise the use of physical memory will be limited. physical limit Limitation of the physical memory in units of whole MB. Only has an effect when the parameter physical limited has been set to a non zero value. virtual enabled If zero, the use of virtual memory will be disabled, otherwise the use of virtual memory will be enabled. virtual limited If zero, the use of virtual memory will be not limited, otherwise the use of virtual memory will be limited. Only has an effect if the parameter virtual enabled has been set to a non zero value. virtual limit Limitation of the virtual memory in units of whole MB. Only has an effect if the parameters virtual enabled and virtual limited have both been set to a non zero value. virtual directory Directory to use for storing swap files that will be used for providing virtual memory. Only has an effect if the parameter virtual enabled has been set to a non zero value. &no-i18n-plugin_newsignal; (New Signal) Screenshot Screenshot of the New Signal Plugin &i18n-plugin_lbl_internal_name; &no-i18n-plugin_newsignal; &i18n-plugin_lbl_type; function &i18n-plugin_lbl_description; Provides a dialog to create a new file. Please refer to the section in this manual for more information. &i18n-plugin_lbl_commands; , &no-i18n-plugin_noise; (Noise Generator) Screenshot Screenshot of the Noise Generator Plugin &i18n-plugin_lbl_internal_name; &no-i18n-plugin_noise; &i18n-plugin_lbl_type; effect &i18n-plugin_lbl_description; Adds some amount of white noise to the current selection. The amount of noise can be selected between zero (no noise, original remains unchanged) and one (original will be replaced by 100% noise). &i18n-plugin_lbl_parameters; level Noise level, always has to be a floating point number above zero and below or equal to one. mode value description &no-i18n-tag;0 Enter the noise value as percentage of the amplitude, from 0 to 100. &no-i18n-tag;1 Enter the noise in decibel, from -21 dB to 0 dB. &no-i18n-plugin_normalize; (Normalizer) &i18n-plugin_lbl_internal_name; &no-i18n-plugin_normalize; &i18n-plugin_lbl_type; effect &i18n-plugin_lbl_description; Normalizes the volume level of the current selection. Use this if the volume of your signal is too low or too high. The algorithm is taken from the normalize project, and was originally written by Chris Vaill . &no-i18n-plugin_notch_filter; (Notch Filter) Screenshot Screenshot of the Notch Filter Plugin &i18n-plugin_lbl_internal_name; &no-i18n-plugin_notch_filter; &i18n-plugin_lbl_type; effect &i18n-plugin_lbl_description; Applies a notch filter to the current selection. A notch filter removes a small range of frequencies around a center frequency and lets all other frequencies below and above the center frequency by more than half of the bandwidth pass. Use this to filter out single distortion frequencies. The filter has grade two and is based on the implementation of Juhana Sadeharju . &i18n-plugin_lbl_parameters; frequency Center frequency of the filter in Hz, must be below half of the sample rate of the file. bandwidth Bandwidth of the filter in Hz. &no-i18n-plugin_pitch_shift; (Pitch Shift) Screenshot Screenshot of the Pitch Shift Plugin &i18n-plugin_lbl_internal_name; &no-i18n-plugin_pitch_shift; &i18n-plugin_lbl_type; effect &i18n-plugin_lbl_description; The pitch shift effect modifies the signal by changing the speed of the content, but with keeping the original length. You can select the relative speed either by factor from 1/10 to x5, or as a percentage from 1% to 400% of the original speed. A speed factor below 1.0 pitches the signal down (lower voice, makes voices sound older), factor 1.0 does no change and a factor above 1.0 pitches the signal up (higher voice, mickey mouse effect). The implementation is based on the work of Jeff Tranter and Stefan Westerfeld &i18n-plugin_lbl_parameters; speed Factor for changing the speed, has to be a floating point number between 0.001 and 4.0. frequency Frequency internally used by the filter in Hz, has to be between 2.0 and 10.0. mode value description &no-i18n-tag;0 Enter the speed value as factor from 1/10 to x5. &no-i18n-tag;1 Enter the speed value as percentage from 1 to 400. &no-i18n-plugin_playback; (Playback) Screenshot Screenshot of the Playback Plugin &i18n-plugin_lbl_internal_name; &no-i18n-plugin_playback; &i18n-plugin_lbl_type; function &i18n-plugin_lbl_description; Provides a dialog to set up the playback parameters. Please refer to the section in this manual for more information. &i18n-plugin_lbl_parameters; playback method The method used for playback, see PlayBackParam.h. playback device A string that determines the playback device or channel. The meaning depends on the playback method. channels The number of channels to use for playback, currently supports only 1 (mono) or 2 (stereo). bits per sample The number of bits per sample for playback, should be 8, 16, 24 or 32. Depends on the playback method and the playback device. buffer size Determines the size of the playback buffer, used as exponent for calculating the real buffer size as 2^n, e.g. setting this to 16 gives a buffer size of 2^16 = 64 kB. &no-i18n-plugin_record; (Record) Screenshot Screenshot of the Record Plugin &i18n-plugin_lbl_internal_name; &no-i18n-plugin_record; &i18n-plugin_lbl_type; function &i18n-plugin_lbl_description; Provides a dialog to set up the record parameters and to do a recording. Please refer to the section in this manual for more information. &i18n-plugin_lbl_parameters; recording method The method used for recording, see RecordParams.h. pre recording enabled Enable/disable pre recording (1 if enabled, 0 if disabled). pre recording time Number of seconds for pre recording. limit recording time Enable/disable limiting of recording time (1 if limited, 0 if not limited). recording time Duration of the recording in seconds. use starting time Enable/disable starting time (1 if used, 0 if not used). starting time Date/time to start the recording, in ISO format. use trigger level Enable/disable trigger level (1 if used, 0 if not used). trigger level Trigger level in percent. recording device A string that determines the recording device. channels The number of channels to use for recording. sample rate Sample rate in samples per second. compression Compression to use for storing the samples. sample format Sample format to use for storing the samples, see section about sample formats. bits per sample The number of bits per sample for recording, should be 8, 16, 24 or 32. buffer count Determines the number buffers used for recording. buffer size Determines the size of the recording buffer, used as exponent for calculating the real buffer size as 2^n, e.g. setting this to 16 gives a buffer size of 2^16 = 64 kB. Alternative Parameters: record plugin direct mode Can be used as a single parameter for setting up the plugin. The following values are possible: value description &no-i18n-tag;format Open the recording dialog and select the Format tab. &no-i18n-tag;source Open the recording dialog and select the Source tab. &no-i18n-tag;start_now Open the recording dialog and directly start recording. &no-i18n-plugin_reverse; (Reverse) &i18n-plugin_lbl_internal_name; &no-i18n-plugin_reverse; &i18n-plugin_lbl_type; effect &i18n-plugin_lbl_description; This simple effect reverses the content of the current selection. &no-i18n-plugin_samplerate; (Sample Rate Conversion) &i18n-plugin_lbl_internal_name; &no-i18n-plugin_samplerate; &i18n-plugin_lbl_type; effect &i18n-plugin_lbl_description; Changes the sample rate of the current selection or the whole signal. &i18n-plugin_lbl_parameters; new rate The new sample rate in samples per second (floating point value). mode (optional) If this parameter is used and set to the value "all", then this effect will be applied to the whole signal. Otherwise it will be applied to the current selection only. &no-i18n-plugin_saveblocks; (Save Blocks) Screenshot Screenshot of the Save Blocks Plugin &i18n-plugin_lbl_internal_name; &no-i18n-plugin_saveblocks; &i18n-plugin_lbl_type; function &i18n-plugin_lbl_description; Saves all sections between markers, each into a separate file. Each file is given a name that can be customized by using a pattern that can contain the original file name, an index and the number of sections. It is also allowed that the file name pattern contains forward slashes as path separators, which allows saving the sections into different sub directories. Please note that all whitespace characters around such path separators are silently removed, to avoid creation of directory names which begin or end with a whitespace. &i18n-plugin_lbl_parameters; name The name of the original file, will be used as base name for the file names. pattern A pattern that will be used for creating the names of the files. It can contain the following wildcards which will be replaced by the corresponding content when creating the final file name: wildcard description &no-i18n-tag;[%nr] Will be replaced with the current index of the file to save. &no-i18n-tag;[%count] Will be replaced with the number of sections that will be saved. &no-i18n-tag;[%total] Will be replaced with the index of the last file to save. &no-i18n-tag;[%filename] Will be replaced with the base file name, without path and without extension. &no-i18n-tag;[%fileinfo{keyword}] Will be replaced with the content of a file information identified by keyword. See section for a list of all available keywords. &no-i18n-tag;[%title] - Will be replaced with the title the block, which is taken + Will be replaced with the title of the block, which is taken from the descriptive text of the label at the start of the block. If that text is empty it will fall back to the title of the file (see file information item "Name"). If this also does not exist, it will fall back to the base file name as described above. All numeric wildcards can also contain a numerical argument after the "%" and the identifier, to force a certain number of digits. If the number is preceded by a 0 then the result will contain leading zeroes, otherwise it will contain leading spaces. Example: [%04nr] produces a number between 0001 and 9999. numbering mode Determines where the numbering should start. value description &no-i18n-tag;0 Continue after the index of the highest index that already exists, this avoids overwriting existing files. &no-i18n-tag;1 Always start with index 1, with the risk of overwriting existing files. selection only value description &no-i18n-tag;0 Save all sections of the whole file. &no-i18n-tag;1 Save only the sections that are within the current selection. If nothing is selected, the whole file will be saved. &no-i18n-plugin_selectrange; (Select Range) Screenshot Screenshot of the Select Range Plugin &i18n-plugin_lbl_internal_name; &no-i18n-plugin_selectrange; &i18n-plugin_lbl_type; function &i18n-plugin_lbl_description; Shows a dialog to select a range of samples. The start and the length of the selection can be set either by a time in milliseconds, in samples, or as a percentage of the total length of the file. &i18n-plugin_lbl_parameters; start mode Determines the units in which the start of the selection will be given. value description &no-i18n-tag;0 milliseconds &no-i18n-tag;1 samples &no-i18n-tag;2 percentage of the length of the file range mode Determines the units in which the length of the selection will be given. See the description if the parameter start mode for a list of possible values. start The start of the selection, in milliseconds, samples or percentage of the length of the file, depending on the parameter range mode. length The length of the selection, in milliseconds, samples or percentage of the length of the file, depending on the parameter range mode. &no-i18n-plugin_sonagram; (Sonagram) Screenshot Screenshot of the setup dialog of the Sonagram Plugin Screenshot Screenshot of the Sonagram Window &i18n-plugin_lbl_internal_name; &no-i18n-plugin_sonagram; &i18n-plugin_lbl_type; function &i18n-plugin_lbl_description; Evaluates the current selection by generating a sonagram. A sonagram is an evaluation of a signal over time (x axis), frequency (y axis) and intensity (color). &i18n-plugin_lbl_parameters; FFT points Number of points of the FFT, a whole number between 4 and 32767 which determines the frequency resolution. window function The window function used for the FFT calculation, supported values are: value description &no-i18n-tag;none no window function &no-i18n-tag;hamming Hamming window &no-i18n-tag;hanning Hanning window &no-i18n-tag;blackman Blackman window &no-i18n-tag;triangular Triangular window use colors If set to non-zero, use colors for intensity, if set to zero use grayscales. track changes If set to non-zero, the sonagram will be updated when the area that was evaluated has changed. If set to zero it will never be updated. follow selection Not yet implemented, use zero for this parameter. &no-i18n-plugin_stringenter; (Enter Command) Screenshot Screenshot of the Enter Command Plugin &i18n-plugin_lbl_internal_name; &no-i18n-plugin_stringenter; &i18n-plugin_lbl_type; function &i18n-plugin_lbl_description; A small dialog window that allows to enter a &kwave; text command. Please refer to the chapter in this manual. &i18n-plugin_lbl_parameters; preset (optional) A text that is shown in the edit field when entering the dialog. This parameter is optional, if omitted the edit field of the dialog will be empty at start. &no-i18n-plugin_volume; (Volume) Screenshot Screenshot of the Volume Plugin &i18n-plugin_lbl_internal_name; &no-i18n-plugin_volume; &i18n-plugin_lbl_type; effect &i18n-plugin_lbl_description; With this plugin you can change the volume of the current selection by a constant factor. The corresponding dialog allows to enter this factor as a numeric factor given as a floating point value between 0.10 and 10.0, a percentage between 1 and 1000, or in decibel between -21 and +21. Use a factor above 1.0 (or percentage above 100 or more than 0 dB) if the file is too silent, or a factor below 1.0 (percentage below 100 or less than 0 dB) if the file is too loud. &i18n-plugin_lbl_parameters; factor A floating point value with the amplification factor. mode value description &no-i18n-tag;0 factor &no-i18n-tag;1 percentage &no-i18n-tag;1 decibel &no-i18n-plugin_zero; (Zero Generator) &i18n-plugin_lbl_internal_name; &no-i18n-plugin_zero; &i18n-plugin_lbl_type; effect &i18n-plugin_lbl_description; This plugin has two modes of operation. If used without parameters it wipes the current selection by overwriting it with silence. When used with two parameters, it inserts some amount of silence at the start of the current selection. &i18n-plugin_lbl_parameters; length mode Determines the units in which the length of the inserted silence will be given. value description &no-i18n-tag;0 milliseconds &no-i18n-tag;1 samples &no-i18n-tag;2 percentage of the length of the file length Length of the silence to insert, in milliseconds, samples or percentage of the length of the file, depending on the parameter length mode. Questions and Answers What do I need to compile &kwave;? Read in the developer documentation. Which sound cards does &kwave; support? &kwave; does not need support for any special sound card. The sound card only has to be supported by your operating system and &kwave; uses its interface to the operating system's sound driver through a OSS or ALSA interface. So &kwave; can play on any sound card that KDE is able to play on. Why does &kwave; consume more memory than it can be expected from the size of the opened file? The reason for this is that &kwave; internally stores all samples in 32-bit integers. This was easy to program, made the application faster and a bit more reliable. So if you load an 8-bit file with about one megabyte it will consume about four megabytes. Maybe we will change this somewhere in the future... Which sound formats does &kwave; support? &kwave; currently supports .wav files with 8, 16 and 24 bits per sample, with any number of channels (of course including mono and stereo). Additionally it can import all file types that libaudiofile supports and some other formats like Ogg/Vorbis and MP3. What if I have files with a format not supported by &kwave;? If you have to work on a different format, you can convert it into .wav format. A good set of tools for this is in the SoX package, they have also some nice documentation! I get errors when I want to do playback? Maybe you have chosen a combination of playback rate and sample size that is not supported by your sound driver and / or sound hardware. Try playback with 8 bits per sample and mono first, this should always work. Then try to increase the bits per sample and stereo playback step by step. Note that some playback rates are not at all supported by some sound hardware. The playback seems to do something but I hear nothing? Maybe you have forgotten to increase the volume of the playback channel. &kwave; is not responsible for changing the playback volume. Some files are played with half-speed? Try choosing a different sound playback device. The playback sometimes is disturbed and interrupted? You should increase the size of the playback buffer to get a "smoother" playback (this also makes the playback control reacting a bit slower). The playback does not stop if I immediately press the stop button? The reason for this is that the sound driver already has received some playback data from &kwave; at the moment when you press the stop button. Decrease the size of the playback buffer and it should react faster (but makes interruptions more probable). Is ALSA supported? Yes, since v0.7.4 for playback and recording What about playback with 18, 20, 24 or 32 bits per sample or more than two channels? This is possible through the ALSA interface, since v0.7.4. What about MP3 support? Well, as long as there are patent issues, we support only MP3 import through the mad library and export via the external program lame. Additionally you need to have the permission to use code covered by the MP3 patents when generating a Kwave package for distributing! Credits and License &kwave; Program copyright from 1998-2000 Martin Wilz martin@wilz.de Program copyright since 2000 Thomas Eschenbacher thomas.eschenbacher@gmx.de For a complete list of authors and licenses of all files, please refer to the LICENSES file, which is included in the sources. There also is a file with the name AUTHORS that lists all authors and contributors of &kwave;. Documentation copyright (C) &version_year; Thomas Eschenbacher thomas.eschenbacher@gmx.de &underFDL; &underGPL; Main Authors Martin Wilz martin@wilz.de creator of the project, active development 1998-2000 Thomas Eschenbacher thomas.eschenbacher@gmx.de maintainer since 2000, core development Major Contributors Aurelien Jarno aurel32@debian.org debian packager, patches Carlos R pureacetone@gmail.com spanish translation David Flogeras dflogera@nbnet.nb.ca Notch Filter plugin Gilles Caulier caulier.gilles@free.fr i18n, french translations, splashscreen, beta tester Pavel Fric pavelfric@seznam.cz Czech translation Ralf Waspe rwaspe@web.de Help/About plugin Sven-Steffen Arndt ssa29@gmx.de homepage, german translation Minor contributors, copyright holders and others Aaron Holtzman aholtzma@ess.engr.uvic.ca libkwave/cpu_accel.cpp Bertrand Songis bsongis@gmail.com [historic] french translation fixes, substitutes for patented libaudiofile code, debian bug 419124 Carsten Lohrke carlo@gentoo.org svn r2163, patch for libaudiofile detection Chris Vaill chrisvaill@gmail code base for the normalize plugin David Faure faure@kde.org cmake/FindAlsa.cmake Diederick de Vries diederick76@gmail.com packaging for Crux Linux Espen Sand espen@kde.org + Mirko Boehm mirko@kde.org K3AboutContainer, base of KwaveAboutContainer Everaldo Coelho contact@everaldo.com the crystal icon theme http://www.everaldo.com/crystal/ Jaroslav Kysela parts of plugins/playback/PlayBack-ALSA.cpp Jeff Tranter parts of plugins/pitch_shift/PitchShiftFilter.{h,cpp} Juhana Sadeharju kouhia@nic.funet.fi plugins/band_pass/BandPass.{h,cpp}, plugins/lowpass/LowPassFilter.cpp, plugins/notch_filter/NotchFilter.{h,cpp} Kurt Roeck Q@ping.be svn r1370, fix for debian bug#288781, compilation for amd64 Mark Donohoe (KDE) donohoe@kde.org some icons and bitmaps for toolbar and GUI Martin Hinsch vidas@sourceforge.net Matrix class Matthias Kretz kretz@kde.org cmake/FindAlsa.cmake Miguel Freitas parts of libkwave/memcpy.c Richard Laerkaeng, richard@goteborg.utfors.se cmake/FindOggVorbis.cmake Rik Hemsley rik@kde.org level meter Stefan Westerfeld stefan@space.twc.de parts of plugins/pitch_shift/PitchShiftFilter.{h,cpp} Joerg-Christian Boehme joerg@chaosdorf.de plugins/record/Record-PulseAudio.cpp plugins/record/Record-PulseAudio.h + + + Sebastian Trueg trueg@k3b.org, + + Gustavo Pichorim Boiko gustavo.boiko@kdemail.net, + + Michal Malek michalm@jabster.pl + + + parts of plugins/export_k3b/K3BExportPlugin.cpp + + Thanks To Martin Kuball makube@user.sourceforge.net beta tester Jorge Luis Arzola arzolacub@gmx.de packaging for SuSE Linux Michael Favreau michel.favreau@free.fr packaging for Arch Linux T.H.F. Klok and Cedric Tefft maintainers of the id3lib library Robert Leslie rob@mars.org author of the mad mp3 decoder library Robert M. Stockmann stock@stokkie.net packaging for Mandrake / X86_64 Erik de Castro Lopo erikd@zip.com.au author of the sndfile library Michael Pruett mpruett@sgi.com author of the audiofile library File Info List of File Info Identifiers Keyword Description &no-i18n-tag;Album Name of the album if the source is an album that consist of more medias. &no-i18n-tag;Annotation Provides general comments about the file or the subject of the file. If the comment is several sentences long, end each sentence with a period. Do not include newline characters! &no-i18n-tag;Archival location Indicates where the subject of the file is archived. &no-i18n-tag;Author Identifies the name of the author of the original subject of the file. Example: van Beethoven, Ludwig &no-i18n-tag;Lower Bitrate Specifies the lower limit in a VBR bitstream. &no-i18n-tag;Bitrate Mode Bitrate Mode (ABR, VBR, CBR, etc...) &no-i18n-tag;Bitrate Nominal bitrate of the audio stream in bits per second &no-i18n-tag;Upper Bitrate Specifies the upper limit in a VBR bitstream. &no-i18n-tag;Bits per Sample Specifies the number of bits per sample. &no-i18n-tag;CD Number of the CD, if the source is an album of more CDROMs &no-i18n-tag;CDS Number of CDs, if the source is an album of more CDROMs &no-i18n-tag;Commissioned Lists the name of the person or organization that commissioned the subject of the file. &no-i18n-tag;Comments Provides general comments about the file or the subject of the file. If the comment is several sentences long, end each sentence with a period. Do not include newline characters! &no-i18n-tag;Compression Sets a mode for compressing the audio data to reduce disk space. &no-i18n-tag;Contact Contact information for the creators or distributors of the track. This could be a URL, an email address, the physical address of the producing label. &no-i18n-tag;Copyright Records the copyright information for the file. If there are multiple copyrights, separate them by a semicolon followed by a space. Example: Copyright Linux community 2002 &no-i18n-tag;Copyrighted Indicates whether the file is protected by copyright or not. &no-i18n-tag;Date Specifies the date the subject of the file was created. Example: 2001-12-24 &no-i18n-tag;Engineer Shows the name of the engineer who worked on the file. If there are multiple engineers, separate the names by a semicolon and a blank. &no-i18n-tag;Estimated Length Estimated length of the file in samples &no-i18n-tag;Filename Name of the opened file &no-i18n-tag;File Size Size of the file in bytes &no-i18n-tag;Genre Describes the genre or style of the original work. Examples: classic, pop &no-i18n-tag;ISRC ISRC number for the track; see the ISRC intro page for more information on ISRC numbers. http://www.ifpi.org/site-content/online/isrc_intro.html &no-i18n-tag;Keywords Provides a list of keywords that refer to the file or subject of the file. &no-i18n-tag;Labels The list of labels/markers. &no-i18n-tag;Length Length of the file in samples. &no-i18n-tag;License License information, e.g., All Rights Reserved, Any Use Permitted, an URL to a license or the EFF Open Audio License (distributed under the terms of the Open Audio License. See http://www.eff.org/IP/Open_licenses/eff_oal.html for details), etc. &no-i18n-tag;Medium Describes the original subject of the file, where it was first recorded. Example: orchestra &no-i18n-tag;Mime Type Mime type of the file format &no-i18n-tag;Emphasis Audio emphasis mode &no-i18n-tag;Layer MPEG Layer, I, II or III &no-i18n-tag;Mode Extension MPEG Mode Extension (only if Joint Stereo) &no-i18n-tag;Version MPEG Version, 1, 2 or 2.5 &no-i18n-tag;Name Stores the title of the subject of the file. Example: Symphony No.6, Op.68 "Pastoral" &no-i18n-tag;Opus Frame Length Opus Frame Length in ms (supported values are 2.5, 5, 10, 20, 40, or 60 ms) &no-i18n-tag;Organization Name of the organization producing the track (i.e. the record label) &no-i18n-tag;Original Indicates whether the file is an original or a copy &no-i18n-tag;Performer The artist(s) who performed the work. In classical music this would be the conductor, orchestra, soloists. In an audio book it would be the actor who did the reading. &no-i18n-tag;Private Indicates whether the subject is private &no-i18n-tag;Product Specifies the name or the title the file was originally intended for. Example: Linux audio collection &no-i18n-tag;Sample Format Format used for storing the digitized audio samples. Example: 32-bit IEEE floating-point &no-i18n-tag;Sample Rate Number of samples per second &no-i18n-tag;Software Identifies the name of the software package used to create the file. Example: Kwave v0.6.4-1 &no-i18n-tag;Source Identifies the name of the person or organization who supplied the original subject of the file. Example: Chaotic Sound Research &no-i18n-tag;Source form Identifies the original form of the material that was digitized. Examples: Record/Vinyl/90RPM, Audio DAT, tape/CrO2/60min &no-i18n-tag;Subject Describes the subject of the file. Example: Bird voices at early morning &no-i18n-tag;Technician Identifies the technician who digitized the subject file. Example: Torvalds, Linus &no-i18n-tag;Track Track of the CD if the source was a CDROM. &no-i18n-tag;Tracks Number of tracks of the CD if the source was a CDROM. &no-i18n-tag;Channels Specifies the number of channels of the signal. &no-i18n-tag;Base Quality Base quality of the compression in VBR mode &no-i18n-tag;Version May be used to differentiate multiple versions of the same track title in a single collection. (e.g. remix info)
diff --git a/plugins/CMakeLists.txt b/plugins/CMakeLists.txt index e2ee8038..0a2d9de6 100644 --- a/plugins/CMakeLists.txt +++ b/plugins/CMakeLists.txt @@ -1,129 +1,130 @@ ############################################################################# ## Kwave - plugins/CMakeLists.txt ## ------------------- ## begin : Mon May 28 2007 ## copyright : (C) 2007 by Thomas Eschenbacher ## email : Thomas.Eschenbacher@gmx.de ############################################################################# # ############################################################################# # # # 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. # # # # For details see the accompanying cmake/COPYING-CMAKE-SCRIPTS file. # # # ############################################################################# MACRO(KWAVE_PLUGIN _plugin) ######################################################################### ### compile stage ### INCLUDE_DIRECTORIES( ${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_CURRENT_BINARY_DIR} ) KI18N_WRAP_UI(plugin_${_plugin}_LIB_SRCS ${plugin_${_plugin}_LIB_UI}) ######################################################################### ### link stage ### ADD_LIBRARY(plugin_${_plugin} MODULE ${plugin_${_plugin}_LIB_SRCS}) TARGET_LINK_LIBRARIES(plugin_${_plugin} kwavegui kwave ${plugin_${_plugin}_LIBS} ${SAMPLERATE_LIBS} Qt5::Core Qt5::Concurrent Qt5::Widgets KF5::ConfigCore KF5::CoreAddons KF5::I18n KF5::IconThemes KF5::KIOFileWidgets KF5::Service KF5::TextWidgets KF5::WidgetsAddons KF5::XmlGui ) SET_TARGET_PROPERTIES(plugin_${_plugin} PROPERTIES PREFIX "kwaveplugin_" OUTPUT_NAME "${_plugin}" LINK_FLAGS "-Wl,--export-dynamic" ENABLE_EXPORTS TRUE ) SET(LIBRARY_OUTPUT_PATH ${CMAKE_CURRENT_BINARY_DIR}) CONFIGURE_FILE( ${CMAKE_CURRENT_SOURCE_DIR}/kwaveplugin_${_plugin}.desktop.in ${CMAKE_CURRENT_BINARY_DIR}/kwaveplugin_${_plugin}.desktop ) KCOREADDONS_DESKTOP_TO_JSON( plugin_${_plugin} ${CMAKE_CURRENT_BINARY_DIR}/kwaveplugin_${_plugin}.desktop DEFAULT_SERVICE_TYPE Kwave/Plugin ) ######################################################################### ### install ### ADD_DEPENDENCIES(plugin_${_plugin} libkwave libkwavegui) INSTALL(TARGETS plugin_${_plugin} LIBRARY DESTINATION ${PLUGIN_INSTALL_DIR}/kwave ) ENDMACRO(KWAVE_PLUGIN) INSTALL( FILES ${CMAKE_CURRENT_SOURCE_DIR}/kwave-plugin.desktop DESTINATION ${SERVICETYPES_INSTALL_DIR} ) ############################################################################# ADD_SUBDIRECTORY( about ) ADD_SUBDIRECTORY( amplifyfree ) ADD_SUBDIRECTORY( band_pass ) ADD_SUBDIRECTORY( codec_ascii ) ADD_SUBDIRECTORY( codec_audiofile ) # needs libaudiofile ADD_SUBDIRECTORY( codec_flac ) # needs >= libflac 1.2.0 ADD_SUBDIRECTORY( codec_mp3 ) # needs libmad + id3lib + "lame" ADD_SUBDIRECTORY( codec_ogg ) # needs libogg and (libvorbis or libopus) ADD_SUBDIRECTORY( codec_wav ) # needs libaudiofile ADD_SUBDIRECTORY( debug ) +ADD_SUBDIRECTORY( export_k3b ) ADD_SUBDIRECTORY( fileinfo ) ADD_SUBDIRECTORY( goto ) ADD_SUBDIRECTORY( lowpass ) ADD_SUBDIRECTORY( memory ) ADD_SUBDIRECTORY( newsignal ) ADD_SUBDIRECTORY( noise ) ADD_SUBDIRECTORY( normalize ) ADD_SUBDIRECTORY( notch_filter ) ADD_SUBDIRECTORY( pitch_shift ) ADD_SUBDIRECTORY( playback ) # needs one of: OSS/ALSA/PulseAudio ADD_SUBDIRECTORY( record ) # needs OSS and/or ALSA ADD_SUBDIRECTORY( reverse ) ADD_SUBDIRECTORY( samplerate ) # needs libsamplerate ADD_SUBDIRECTORY( saveblocks ) ADD_SUBDIRECTORY( selectrange ) ADD_SUBDIRECTORY( sonagram ) # needs fftw >= 3.0 ADD_SUBDIRECTORY( stringenter ) ADD_SUBDIRECTORY( volume ) ADD_SUBDIRECTORY( zero ) ############################################################################# ############################################################################# diff --git a/plugins/export_k3b/CMakeLists.txt b/plugins/export_k3b/CMakeLists.txt new file mode 100644 index 00000000..caee2064 --- /dev/null +++ b/plugins/export_k3b/CMakeLists.txt @@ -0,0 +1,43 @@ +############################################################################# +## Kwave - plugins/export_k3b/CMakeLists.txt +## ------------------- +## begin : Thu Mar 23 2017 +## copyright : (C) 2017 by Thomas Eschenbacher +## email : Thomas.Eschenbacher@gmx.de +############################################################################# +# +############################################################################# +# # +# 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. # +# # +# For details see the accompanying cmake/COPYING-CMAKE-SCRIPTS file. # +# # +############################################################################# + +SET(plugin_export_k3b_LIB_SRCS + K3BExportDialog.cpp + K3BExportPlugin.cpp + K3BExportWidget.cpp +) + +SET(plugin_export_k3b_LIB_UI + K3BExportWidgetBase.ui +) + +SET(plugin_export_k3b_LIBS + KF5::Archive +) + +KWAVE_PLUGIN(export_k3b) + +############################################################################# +############################################################################# + diff --git a/plugins/export_k3b/K3BExportDialog.cpp b/plugins/export_k3b/K3BExportDialog.cpp new file mode 100644 index 00000000..47f276b5 --- /dev/null +++ b/plugins/export_k3b/K3BExportDialog.cpp @@ -0,0 +1,95 @@ +/*************************************************************************** + * K3BExportDialog.cpp - Extended KwaveFileDialog for exporting to K3B + * ------------------- + * begin : Thu Apr 13 2017 + * copyright : (C) 2017 by Thomas Eschenbacher + * email : Thomas.Eschenbacher@gmx.de + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#include "config.h" + +#include +#include + +#include +#include + +#include "libkwave/String.h" + +#include "K3BExportDialog.h" +#include "K3BExportWidget.h" + +//*************************************************************************** +Kwave::K3BExportDialog::K3BExportDialog( + const QString &startDir, + const QString &filter, + QWidget *parent, + const QUrl &last_url, + const QString &last_ext, + QString &pattern, + bool selection_only, + bool have_selection, + Kwave::K3BExportPlugin::export_location_t export_location, + Kwave::K3BExportPlugin::overwrite_policy_t overwrite_policy +) + :Kwave::FileDialog(startDir, Kwave::FileDialog::SaveFile, filter, parent, + last_url, last_ext), + m_widget(new(std::nothrow) Kwave::K3BExportWidget( + this, pattern, selection_only, have_selection, + export_location, overwrite_policy + )) +{ + Q_ASSERT(m_widget); + setCustomWidget(m_widget); +} + +//*************************************************************************** +Kwave::K3BExportDialog::~K3BExportDialog() +{ + if (m_widget) delete m_widget; + m_widget = 0; +} + +// //*************************************************************************** +QString Kwave::K3BExportDialog::pattern() const +{ + Q_ASSERT(m_widget); + return (m_widget) ? m_widget->pattern() : _(""); +} + +//*************************************************************************** +bool Kwave::K3BExportDialog::selectionOnly() const +{ + Q_ASSERT(m_widget); + return (m_widget) ? m_widget->selectionOnly() : false; +} + +//*************************************************************************** +Kwave::K3BExportPlugin::export_location_t + Kwave::K3BExportDialog::exportLocation() const +{ + Q_ASSERT(m_widget); + return (m_widget) ? m_widget->exportLocation() : + Kwave::K3BExportPlugin::EXPORT_TO_SUB_DIR; +} + +//*************************************************************************** +Kwave::K3BExportPlugin::overwrite_policy_t + Kwave::K3BExportDialog::overwritePolicy() const +{ + Q_ASSERT(m_widget); + return (m_widget) ? m_widget->overwritePolicy() : + Kwave::K3BExportPlugin::USE_NEW_FILE_NAMES; +} + +//*************************************************************************** +//*************************************************************************** diff --git a/plugins/export_k3b/K3BExportDialog.h b/plugins/export_k3b/K3BExportDialog.h new file mode 100644 index 00000000..70805145 --- /dev/null +++ b/plugins/export_k3b/K3BExportDialog.h @@ -0,0 +1,95 @@ +/*************************************************************************** + * K3BExportDialog.h - Extended KwaveFileDialog for exporting to K3B + * ------------------- + * begin : Thu Apr 13 2017 + * copyright : (C) 2017 by Thomas Eschenbacher + * email : Thomas.Eschenbacher@gmx.de + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#ifndef K3B_EXPORT_DIALOG_H +#define K3B_EXPORT_DIALOG_H + +#include "config.h" + +#include +#include +#include + +#include "K3BExportPlugin.h" +#include "libgui/FileDialog.h" + +class QUrl; + +namespace Kwave +{ + + class K3BExportWidget; + + class K3BExportDialog: public Kwave::FileDialog + { + Q_OBJECT + public: + + /** + * Constructor. + * @see KFileFialog + * @param startDir the start directory + * @param filter string with a file type filter + * @param parent the parent widget + * @param last_url the last used URL + * @param last_ext the last used extension (preset only) + * @param pattern the pattern used for detecting title and artist + * @param selection_only if true, save only the selection + * @param have_selection if true, there is a selection + * @param export_location where to export files with tracks + * @param overwrite_policy overwrite existing files or use a new name + */ + K3BExportDialog( + const QString &startDir, + const QString &filter, + QWidget *parent, + const QUrl &last_url, + const QString &last_ext, + QString &pattern, + bool selection_only, + bool have_selection, + Kwave::K3BExportPlugin::export_location_t export_location, + Kwave::K3BExportPlugin::overwrite_policy_t overwrite_policy + ); + + /** Destructor */ + virtual ~K3BExportDialog(); + + /** returns the title/artist detection pattern (as is, not escaped) */ + QString pattern() const; + + /** returns true if only the selection should be saved */ + bool selectionOnly() const; + + /** returns export location of the files of the tracks */ + Kwave::K3BExportPlugin::export_location_t exportLocation() const; + + /** returns the file overwrite policy */ + Kwave::K3BExportPlugin::overwrite_policy_t overwritePolicy() const; + + private: + + /** the widget with extra settings for K3B export */ + Kwave::K3BExportWidget *m_widget; + + }; +} + +#endif /* K3B_EXPORT_DIALOG_H */ + +//*************************************************************************** +//*************************************************************************** diff --git a/plugins/export_k3b/K3BExportPlugin.cpp b/plugins/export_k3b/K3BExportPlugin.cpp new file mode 100644 index 00000000..8e9054bb --- /dev/null +++ b/plugins/export_k3b/K3BExportPlugin.cpp @@ -0,0 +1,789 @@ +/************************************************************************* + * K3BExportPlugin.cpp - export of K3B project files + * ------------------- + * begin : Thu Apr 13 2017 + * copyright : (C) 2017 by Thomas Eschenbacher + * email : Thomas.Eschenbacher@gmx.de + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#include "config.h" + +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include // for the i18n macro +#include + +#include "libkwave/CodecManager.h" +#include "libkwave/Encoder.h" +#include "libkwave/FileInfo.h" +#include "libkwave/Label.h" +#include "libkwave/LabelList.h" +#include "libkwave/Logger.h" +#include "libkwave/MessageBox.h" +#include "libkwave/MetaDataList.h" +#include "libkwave/Parser.h" +#include "libkwave/Plugin.h" +#include "libkwave/PluginManager.h" +#include "libkwave/SignalManager.h" +#include "libkwave/String.h" +#include "libkwave/Utils.h" + +#include "K3BExportDialog.h" +#include "K3BExportPlugin.h" + +KWAVE_PLUGIN(export_k3b, K3BExportPlugin) + +/** mime type of K3B project files */ +#define K3B_PROJECT_MIME_TYPE "application/x-k3b" + +/** file suffix of K3B project files */ +#define K3B_FILE_SUFFIX _("*.k3b") + +/** number of digits to use for out files */ +#define OUTFILE_DIGITS 4 + +/** file name pattern for out files */ +#define OUTFILE_PATTERN (_("[%0") + _("%1nr]").arg(OUTFILE_DIGITS)) + +/** file suffix for out files */ +#define OUTFILE_SUFFIX _(".wav") + +//*************************************************************************** +Kwave::K3BExportPlugin::K3BExportPlugin(QObject *parent, + const QVariantList &args) + :Kwave::Plugin(parent, args), + m_url(), + m_pattern(), + m_selection_only(false), + m_export_location(EXPORT_TO_SUB_DIR), + m_overwrite_policy(USE_NEW_FILE_NAMES), + m_block_info() +{ +} + +//*************************************************************************** +Kwave::K3BExportPlugin::~K3BExportPlugin() +{ +} + +//*************************************************************************** +int Kwave::K3BExportPlugin::interpreteParameters(QStringList ¶ms) +{ + bool ok; + QString param; + + // evaluate the parameter list + if (params.count() != 5) + return -EINVAL; + + // the selected URL + m_url = QUrl::fromUserInput(Kwave::Parser::unescape(params[0])); + if (!m_url.isValid()) return -EINVAL; + + // label pattern + m_pattern = Kwave::Parser::unescape(params[1]); + + // selection only + param = params[2]; + int v = param.toInt(&ok); + Q_ASSERT(ok); + if (!ok) return -EINVAL; + m_selection_only = (v != 0); + + // export location + param = params[3]; + int where = param.toInt(&ok); + Q_ASSERT(ok); + if (!ok) return -EINVAL; + if ((where != EXPORT_TO_SAME_DIR) && + (where != EXPORT_TO_SUB_DIR)) return -EINVAL; + m_export_location = static_cast(where); + + // overwrite policy + param = params[4]; + int overwrite = param.toInt(&ok); + Q_ASSERT(ok); + if (!ok) return -EINVAL; + if ((overwrite != OVERWRITE_EXISTING_FILES) && + (overwrite != USE_NEW_FILE_NAMES)) return -EINVAL; + m_overwrite_policy = static_cast(overwrite); + + return 0; +} + +//*************************************************************************** +void Kwave::K3BExportPlugin::scanBlocksToSave(const QString &base, + sample_index_t selection_left, + sample_index_t selection_right) +{ + sample_index_t block_start; + sample_index_t block_end = 0; + + Kwave::LabelList labels(signalManager().metaData()); + Kwave::LabelListIterator it(labels); + Kwave::Label label = (it.hasNext()) ? it.next() : Kwave::Label(); + + // get the title of the whole file, in case that a block does not have + // an own title + FileInfo info(signalManager().metaData()); + QString file_title = info.get(INF_NAME).toString(); + QString file_artist = info.get(INF_AUTHOR).toString(); + + // fallback: if there is no INF_NAME either, fall back to the file + // name as last resort + if (!file_title.length()) file_title = base; + + m_block_info.clear(); + QString prev_title = file_title; + for (unsigned int index = 1; ; ++index) { + block_start = block_end; + block_end = (label.isNull()) ? signalLength() : label.pos(); + + QString block_title = (!label.isNull() && label.name().length()) ? + label.name() : prev_title; + + if ((block_end > selection_left) && (block_start <= selection_right)) { + BlockInfo block; + + // init and set reasonable defaults + block.m_index = index; + block.m_filename = QString(); + block.m_start = block_start; + block.m_length = block_end - block_start; + block.m_title = block_title; + block.m_artist = file_artist; + + // detect title and artist + detectBlockMetaData(block_title, m_pattern, block); + m_block_info.append(block); + + prev_title = block.m_title; + +// qDebug("#%d [%llu...%llu]", index, block_start, block_end); +// qDebug(" title = '%s'", DBG(block.m_title)); +// qDebug(" artist = '%s'", DBG(block.m_artist)); + } + + if (label.isNull()) break; + label = (it.hasNext()) ? it.next() : Kwave::Label(); + } +} + +//*************************************************************************** +QString Kwave::K3BExportPlugin::createFileName(const QString &pattern, + unsigned int index) +{ + QString name = pattern; + QString num = _("%1").arg(index, OUTFILE_DIGITS, 10, QLatin1Char('0')); + name.replace(OUTFILE_PATTERN, num); + name += OUTFILE_SUFFIX; + return name; +} + +//*************************************************************************** +bool Kwave::K3BExportPlugin::detectBlockMetaData( + const QString &text, + const QString &pattern, + Kwave::K3BExportPlugin::BlockInfo &block +) +{ + if (!pattern.length()) { + // auto detect -> try all known patterns + foreach (const QString &p, knownPatterns()) + if (detectBlockMetaData(text, p, block)) + return true; + return false; + } + + // list of placeholders and pointers to the resulting strings + QMap map_patterns; + map_patterns.insert(_("[%artist]"), &block.m_artist); + map_patterns.insert(_("[%title]"), &block.m_title); + + // try to find the placeholders within the pattern + // NOTE: we use a map because it will automatically be sorted (by pos) + QString pattern_esc = Kwave::Parser::escape(pattern); + QMap map_result; + foreach (const QString &placeholder, map_patterns.keys()) { + QString placeholder_esc; + placeholder_esc = Kwave::Parser::escape(placeholder); + if (pattern_esc.contains(placeholder_esc)) { + const QString rx_string = _("(.+)"); + int pos = pattern.indexOf(placeholder); + pattern_esc.replace(placeholder_esc, rx_string); + map_result.insert(pos, map_patterns[placeholder]); + } + } + if (map_result.isEmpty()) + return false; // no placeholders found in the patterns + + // relax the pattern: turn single whitespace to one or more whitespaces + pattern_esc.replace(QRegExp(_("(\\\\\\s)+")), _("\\s+")); + + // try to match the pattern on the given text + QRegExp rx(pattern_esc, Qt::CaseInsensitive); + if (!rx.exactMatch(text.trimmed())) + return false; // does not match :-( + + // we found a match + // -> now map the results into the corresponding result strings + for (int index = 0; index < map_result.count(); ++index) { + QString value = rx.cap(index + 1).trimmed(); + if (value.length()) { + QString *result = map_result[map_result.keys()[index]]; + if (result) *result = value; + } + } + + return true; +} + +//*************************************************************************** +void Kwave::K3BExportPlugin::load(QStringList ¶ms) +{ + Q_UNUSED(params); + + QString menu_path = _("File/Save/%1").arg(i18nc( + "menu: /File/Save/Export to K3B Project...", + "Export to K3B Project..." + )); + emitCommand(_("menu(plugin:setup(export_k3b),%1%2)").arg( + menu_path).arg(_("/#group(@SIGNAL)"))); + emitCommand(_("menu(plugin:setup(export_k3b),%1%2)").arg( + menu_path).arg(_("/#icon(application-x-k3b)"))); +} + +//*************************************************************************** +QStringList *Kwave::K3BExportPlugin::setup(QStringList ¶ms) +{ + // try to interpret the previous parameters + interpreteParameters(params); + + sample_index_t selection_left = 0; + sample_index_t selection_right = 0; + selection(0, &selection_left, &selection_right, false); + + // enable the "selection only" checkbox only if there is something + // selected but not everything + bool selected_something = (selection_left != selection_right); + bool selected_all = ((selection_left == 0) && + (selection_right + 1 >= signalLength())); + bool enable_selection_only = selected_something && !selected_all; + + // show a "File / Save As..." dialog for the *.k3b file + QPointer dialog = + new(std::nothrow) Kwave::K3BExportDialog( + _("kfiledialog:///kwave_export_k3b"), + K3B_FILE_SUFFIX + _("|") + i18nc( + "file type filter when exporting to K3B", + "K3B project file (*.k3b)" + ), + parentWidget(), + QUrl::fromUserInput(signalName()), + _("*.k3b"), + m_pattern, + m_selection_only, + enable_selection_only, + m_export_location, + m_overwrite_policy + ); + if (!dialog) return 0; + + dialog->setWindowTitle(description()); + if (dialog->exec() != QDialog::Accepted) { + delete dialog; + return 0; + } + + QStringList *list = new(std::nothrow) QStringList(); + Q_ASSERT(list); + if (!list) { + delete dialog; + return 0; + } + + // user has pressed "OK" + QUrl url = dialog->selectedUrl(); + if (url.isEmpty()) { + delete dialog; + delete list; + return 0; + } + + QString name = url.path(); + QFileInfo path(name); + + // add the correct extension if necessary + if (path.suffix() != K3B_FILE_SUFFIX.mid(2)) + url.setPath(name + K3B_FILE_SUFFIX.mid(1)); + + name = Kwave::Parser::escape(url.toString()); + QString pattern = Kwave::Parser::escape(dialog->pattern()); + int export_location = static_cast(dialog->exportLocation()); + int overwrite_policy = static_cast(dialog->overwritePolicy()); + bool selection_only = (enable_selection_only) ? + dialog->selectionOnly() : m_selection_only; + + *list << name; // url + *list << pattern; // pattern + *list << QString::number(selection_only); // selection only + *list << QString::number(export_location); // export location + *list << QString::number(overwrite_policy); // overwrite policy + + emitCommand(_("plugin:execute(export_k3b,") + + name + _(",") + pattern + _(",") + + QString::number(selection_only) + _(",") + + QString::number(export_location) + _(",") + + QString::number(overwrite_policy) + _(")") + ); + + if (dialog) delete dialog; + return list; +} + +//*************************************************************************** +/* + * taken from K3B, libk3b/projects/k3bdoc.cpp + * + * Copyright (C) 2003-2008 Sebastian Trueg + * + */ +void Kwave::K3BExportPlugin::saveGeneralDocumentData(QDomElement *part) +{ + QDomDocument doc = part->ownerDocument(); + QDomElement mainElem = doc.createElement(_("general")); + + QDomElement propElem = doc.createElement(_("writing_mode")); + propElem.appendChild(doc.createTextNode(_("auto"))); + mainElem.appendChild(propElem); + + propElem = doc.createElement(_("dummy")); + propElem.setAttribute(_("activated"), _("no")); + mainElem.appendChild(propElem); + + propElem = doc.createElement(_("on_the_fly")); + propElem.setAttribute(_("activated"), _("true")); + mainElem.appendChild(propElem); + + propElem = doc.createElement(_("only_create_images")); + propElem.setAttribute(_("activated"), _("no")); + mainElem.appendChild(propElem); + + propElem = doc.createElement(_("remove_images")); + propElem.setAttribute(_("activated"), _("no")); + mainElem.appendChild(propElem); + + part->appendChild( mainElem ); +} + +//*************************************************************************** +/* + * taken from K3B, libk3b/projects/audiocd/k3baudiodoc.cpp + * + * Copyright (C) 2003-2008 Sebastian Trueg + * Copyright (C) 2009 Gustavo Pichorim Boiko + * Copyright (C) 2010 Michal Malek + */ +void Kwave::K3BExportPlugin::saveDocumentData(QDomElement *docElem) +{ + #define GET_INF(inf) doc.createTextNode(info.get(inf).toString()) + + const Kwave::FileInfo info(signalManager().metaData()); + + QDomDocument doc = docElem->ownerDocument(); + saveGeneralDocumentData(docElem); + + // add normalize + QDomElement normalizeElem = doc.createElement(_("normalize")); + normalizeElem.appendChild(doc.createTextNode(_("no"))); + docElem->appendChild(normalizeElem); + + // add hide track + QDomElement hideFirstTrackElem = doc.createElement(_("hide_first_track")); + hideFirstTrackElem.appendChild(doc.createTextNode(_("no"))); + docElem->appendChild(hideFirstTrackElem); + + // save the audio cd ripping settings + // paranoia mode, read retries, and ignore read errors + // ------------------------------------------------------------ + QDomElement ripMain = doc.createElement(_("audio_ripping")); + docElem->appendChild(ripMain); + + QDomElement ripElem = doc.createElement(_("paranoia_mode")); + ripElem.appendChild(doc.createTextNode(_("0"))); + ripMain.appendChild(ripElem); + + ripElem = doc.createElement(_("read_retries")); + ripElem.appendChild(doc.createTextNode(_("0"))); + ripMain.appendChild(ripElem); + + ripElem = doc.createElement(_("ignore_read_errors")); + ripElem.appendChild(doc.createTextNode(_("no"))); + ripMain.appendChild(ripElem); + // ------------------------------------------------------------ + + // save disc cd-text + // ------------------------------------------------------------- + QDomElement cdTextMain = doc.createElement(_("cd-text")); + cdTextMain.setAttribute(_("activated"), _("yes")); + + QDomElement cdTextElem = doc.createElement(_("title")); + cdTextElem.appendChild(GET_INF(INF_NAME)); + cdTextMain.appendChild(cdTextElem); + + cdTextElem = doc.createElement(_("artist")); + cdTextElem.appendChild(GET_INF(INF_AUTHOR)); + cdTextMain.appendChild(cdTextElem); + + cdTextElem = doc.createElement(_("arranger")); + cdTextElem.appendChild(GET_INF(INF_TECHNICAN)); + cdTextMain.appendChild(cdTextElem); + + cdTextElem = doc.createElement(_("songwriter")); + cdTextElem.appendChild(GET_INF(INF_PERFORMER)); + cdTextMain.appendChild(cdTextElem); + + cdTextElem = doc.createElement(_("composer")); + cdTextElem.appendChild(GET_INF(INF_ORGANIZATION)); + cdTextMain.appendChild(cdTextElem); + + cdTextElem = doc.createElement(_("disc_id")); + cdTextElem.appendChild(GET_INF(INF_CD)); + cdTextMain.appendChild(cdTextElem); + + cdTextElem = doc.createElement(_("upc_ean")); + cdTextElem.appendChild(GET_INF(INF_ISRC)); + cdTextMain.appendChild(cdTextElem); + + cdTextElem = doc.createElement(_("message")); + cdTextElem.appendChild(GET_INF(INF_COMMENTS)); + cdTextMain.appendChild(cdTextElem); + + docElem->appendChild( cdTextMain ); + // ------------------------------------------------------------- + + // save the tracks + // ------------------------------------------------------------- + QDomElement contentsElem = doc.createElement(_("contents")); + + unsigned int index = 1; + foreach (const Kwave::K3BExportPlugin::BlockInfo &block, m_block_info) { + QString title = block.m_title; + QString artist = block.m_artist; + QString songwriter = QString(); + QString url = block.m_filename; + + QDomElement trackElem = doc.createElement(_("track")); + + // add sources + QDomElement sourcesParent = doc.createElement(_("sources")); + QDomElement sourceElem = doc.createElement(_("file")); + sourceElem.setAttribute(_("url"), url); + sourceElem.setAttribute(_("start_offset"), _("00:00:00")); + sourceElem.setAttribute(_("end_offset"), _("00:00:00")); + sourcesParent.appendChild(sourceElem); + trackElem.appendChild(sourcesParent); + + // index 0 + QDomElement index0Elem = doc.createElement(_("index0")); + index0Elem.appendChild(doc.createTextNode(QString::number(index))); + trackElem.appendChild(index0Elem); + + // add cd-text + cdTextMain = doc.createElement(_("cd-text")); + cdTextElem = doc.createElement(_("title")); + cdTextElem.appendChild(doc.createTextNode(title)); + cdTextMain.appendChild(cdTextElem); + + cdTextElem = doc.createElement(_("artist")); + cdTextElem.appendChild(doc.createTextNode(artist)); + cdTextMain.appendChild(cdTextElem); + + cdTextElem = doc.createElement(_("arranger")); + cdTextElem.appendChild(GET_INF(INF_TECHNICAN)); + cdTextMain.appendChild(cdTextElem); + + cdTextElem = doc.createElement(_("songwriter")); + cdTextElem.appendChild(doc.createTextNode(songwriter)); + cdTextMain.appendChild(cdTextElem ); + + cdTextElem = doc.createElement(_("composer")); + cdTextElem.appendChild(GET_INF(INF_ORGANIZATION)); + cdTextMain.appendChild(cdTextElem); + + cdTextElem = doc.createElement(_("isrc")); + cdTextElem.appendChild(GET_INF(INF_ISRC)); + cdTextMain.appendChild(cdTextElem); + + cdTextElem = doc.createElement(_("message")); + cdTextElem.appendChild(GET_INF(INF_COMMENTS)); + cdTextMain.appendChild(cdTextElem); + + trackElem.appendChild(cdTextMain); + + // add copy protection + QDomElement copyElem = doc.createElement(_("copy_protection")); + copyElem.appendChild(doc.createTextNode( + info.get(INF_COPYRIGHTED).toInt() ? _("yes") : _("no") + )); + trackElem.appendChild(copyElem); + + // add pre emphasis + copyElem = doc.createElement(_("pre_emphasis")); + copyElem.appendChild(doc.createTextNode(_("no"))); + trackElem.appendChild(copyElem); + + contentsElem.appendChild(trackElem); + index++; + } + // ------------------------------------------------------------- + + docElem->appendChild(contentsElem); +} + +//*************************************************************************** +int Kwave::K3BExportPlugin::start(QStringList ¶ms) +{ + qDebug("K3BExportPlugin::start()"); + + // interpret the parameters + int result = interpreteParameters(params); + if (result) return result; + + // check the output file + if (!m_url.isLocalFile()) + return -EINVAL; // sorry, KZip supports only local files + + // determine output directory and file name pattern + QString k3b_filename = m_url.path(); + QFileInfo fi(k3b_filename); + QString base = fi.completeBaseName(); + QString out_dir; + QString out_pattern; + if (m_export_location == Kwave::K3BExportPlugin::EXPORT_TO_SUB_DIR) { + // export to a subdir with the name ".dir" + out_dir = fi.absolutePath() + QDir::separator() + base + _(".dir"); + out_pattern = _("track-") + OUTFILE_PATTERN; + } else { + // use the same directory as the *.k3b file + out_dir = fi.absolutePath(); + out_pattern = base + _("-track-") + OUTFILE_PATTERN; + } + qDebug("out_dir = '%s'", DBG(out_dir)); + qDebug("out_pattern = '%s'", DBG(out_pattern)); + + // determine the selection settings + sample_index_t selection_left = 0; + sample_index_t selection_right = 0; + QList tracks; + selection(&tracks, &selection_left, &selection_right, false); + + // check: only mono or stereo files are supported + if ((tracks.count() != 1) && (tracks.count() != 2)) { + qWarning("sorry, K3B can not handle %u tracks", tracks.count()); + Kwave::MessageBox::sorry(parentWidget(), i18n( + "Only mono and stereo files can be used for an audio CD. " + "You can either deselect some channels or export the file " + "in a different file format that supports mono and stereo " + "only (for example FLAC) and then try again." + )); + return -EINVAL; + } + + bool selected_something = (selection_left != selection_right); + bool selected_all = ( (selection_left == 0) && + ((selection_right + 1) >= signalLength()) ); + bool enable_selection_only = selected_something && !selected_all; + bool selection_only = enable_selection_only && m_selection_only; + if (!selection_only) { + selection_left = 0; + selection_right = signalLength() - 1; + } + + // create a list of blocks to save, but not yet the output file names + scanBlocksToSave(base, selection_left, selection_right); + unsigned int count = m_block_info.count(); + if (!count) + return -EINVAL; + + // find the start index of the file numbering + unsigned int first = 1; + if (m_overwrite_policy == Kwave::K3BExportPlugin::USE_NEW_FILE_NAMES) { + // use new files, find out the highest existing index + QString pat = out_pattern; + pat.replace(OUTFILE_PATTERN, _("*")); + pat += OUTFILE_SUFFIX; + + QDir dir(out_dir, pat); + QStringList files; + files = dir.entryList(); + + for (unsigned int i = first; i < (first + count); ++i) { + QString name = createFileName(out_pattern, i); + QRegExp rx(_("^(") + name + _(")$"), Qt::CaseInsensitive); + QStringList matches = files.filter(rx); + if (matches.count() > 0) first = i + 1; + } + qDebug("found first usable index -> %d", first); + } else { + // overwrite mode, always start at 1 + } + + // create the complete file names + for (unsigned int i = 0; i < count; ++i) { + m_block_info[i].m_filename = out_dir + QDir::separator() + + createFileName(out_pattern, first + i); + } + + result = saveBlocks(selection_only, out_dir, out_pattern); + if (result != 0) + return result; // aborted or failed -> do not create a k3b file + + result = saveK3BFile(k3b_filename); + if (result != 0) + return result; // aborted or failed -> do not ask about starting k3b + + if (Kwave::MessageBox::questionYesNo(parentWidget(), i18n( + "A K3B project file has been created and audio files have " + "been exported.\n" + "Should I start K3B and open the audio CD project now?" + )) == KMessageBox::Yes) { + // call k3b and pass the project file name (must be full path) + QStringList args; + args << k3b_filename; + if (!QProcess::startDetached(_("k3b"), args)) { + return -EIO; + } + } + + return result; +} + +//*************************************************************************** +int Kwave::K3BExportPlugin::saveBlocks(bool selection_only, + const QString &out_dir, + const QString &out_pattern) +{ + QString first_filename = Kwave::Parser::escapeForFileName( + QUrl::fromLocalFile(createFileName(out_pattern, 1)).toString()); + + // remember the original file info remove all unsupported/ properties, + // to avoid that the saveblocks plugin complains... + const Kwave::FileInfo orig_file_info(signalManager().metaData()); + Kwave::FileInfo file_info(orig_file_info); + QList unsupported_properties; + { + QString mimetype = Kwave::CodecManager::whatContains(m_url); + Kwave::Encoder *encoder = Kwave::CodecManager::encoder(mimetype); + if (encoder) { + unsupported_properties = encoder->unsupportedProperties( + file_info.properties().keys()); + delete encoder; + } + if (!unsupported_properties.isEmpty()) { + foreach (const Kwave::FileProperty &p, unsupported_properties) { + file_info.set(p, QVariant()); + } + } + } + + // make sure that the file uses 16 bits/sample only + file_info.setBits(16); + + signalManager().metaData().replace(Kwave::MetaDataList(file_info)); + + // call the saveblocks plugin and let it do the main work of exporting + // the *.wav files with all the tracks... + + QStringList params; + params << out_dir + QDir::separator() + first_filename; + params << Kwave::Parser::escape(out_pattern); + params << ((m_overwrite_policy == USE_NEW_FILE_NAMES) ? _("0") : _("1")); + params << (selection_only ? _("1") : _("0")); + int result = manager().executePlugin(_("saveblocks"), ¶ms); + + // restore the original file info + signalManager().metaData().replace(Kwave::MetaDataList(orig_file_info)); + + return result; +} + +//*************************************************************************** +int Kwave::K3BExportPlugin::saveK3BFile(const QString &k3b_filename) +{ + // create the K3B file + KZip zip(k3b_filename); + + bool ok = zip.open(QIODevice::WriteOnly); + if (!ok) return -EIO; + + // write the mime type + QByteArray app_type(K3B_PROJECT_MIME_TYPE); + zip.setCompression(KZip::NoCompression); + zip.setExtraField(KZip::NoExtraField); + zip.writeFile(_("mimetype"), app_type); + + // export file global data + QByteArray xml; + QBuffer out(&xml); + out.open(QIODevice::WriteOnly); + + // save the data in the document + QDomDocument xmlDoc(_("k3b_audio_project")); + + xmlDoc.appendChild(xmlDoc.createProcessingInstruction( + _("xml"), _("version=\"1.0\" encoding=\"UTF-8\"") + )); + QDomElement docElem = xmlDoc.createElement(_("k3b_audio_project")); + xmlDoc.appendChild(docElem); + saveDocumentData(&docElem); + QTextStream xmlStream(&out); + xmlDoc.save(xmlStream, 0); + + out.close(); + + zip.setCompression(KZip::NoCompression); + zip.setExtraField(KZip::NoExtraField); + zip.writeFile(_("maindata.xml"), xml.data()); + zip.close(); + + return 0; +} + +//*************************************************************************** +QStringList Kwave::K3BExportPlugin::knownPatterns() +{ + // list of all known detection patterns + QStringList patterns; + patterns << _("[%title] ([%artist])"); + patterns << _("[%title], [%artist]"); + patterns << _("[%artist]: [%title]"); + patterns << _("[%artist] - [%title]"); + return patterns; +} + +//*************************************************************************** +#include "K3BExportPlugin.moc" +//*************************************************************************** +//*************************************************************************** diff --git a/plugins/export_k3b/K3BExportPlugin.h b/plugins/export_k3b/K3BExportPlugin.h new file mode 100644 index 00000000..12137e82 --- /dev/null +++ b/plugins/export_k3b/K3BExportPlugin.h @@ -0,0 +1,179 @@ +/************************************************************************* + * K3BExportPlugin.h - export of K3B project files + * ------------------- + * begin : Thu Apr 13 2017 + * copyright : (C) 2017 by Thomas Eschenbacher + * email : Thomas.Eschenbacher@gmx.de + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#ifndef K3B_EXPORT_PLUGIN_H +#define K3B_EXPORT_PLUGIN_H + +#include "config.h" + +#include +#include +#include +#include +#include + +#include "libkwave/Plugin.h" + +class QDomElement; + +namespace Kwave +{ + + class K3BExportPlugin: public Kwave::Plugin + { + Q_OBJECT + public: + + typedef enum { + EXPORT_TO_SAME_DIR = 0, + EXPORT_TO_SUB_DIR = 1 + } export_location_t ; + + typedef enum { + OVERWRITE_EXISTING_FILES = 0, + USE_NEW_FILE_NAMES = 1 + } overwrite_policy_t; + + /** + * Constructor + * @param parent reference to our plugin manager + * @param args argument list [unused] + */ + K3BExportPlugin(QObject *parent, const QVariantList &args); + + /** Destructor */ + virtual ~K3BExportPlugin(); + + /** @see Kwave::Plugin::load() */ + virtual void load(QStringList ¶ms); + + /** + * Normally this method is used to set up all necessary parameters + * for executing the plugin. This plugin uses it for performing + * actions in the context of the GUI thread. + * + * @param params some parameters + * @return string list with parameters or null pointer + */ + virtual QStringList *setup(QStringList ¶ms); + + /** + * Saves the K3B project file, using the settings made in "setup()" + * @see Kwave::Plugin::start() + */ + virtual int start(QStringList ¶ms); + + /** returns a list of all known detection patterns */ + static QStringList knownPatterns(); + + protected: + + typedef struct { + unsigned int m_index; /**< track index [1...N] */ + QString m_filename; /**< file name for saving */ + sample_index_t m_start; /**< start of the block [samples] */ + sample_index_t m_length; /**< length of the block [samples] */ + QString m_title; /**< title of the block */ + QString m_artist; /**< artist of the song */ + } BlockInfo; + + /** reads values from the parameter list */ + int interpreteParameters(QStringList ¶ms); + + /** + * determines the blocks which should be saved, including + * start position, length and title. + * @param base the base name, without indices, extension etc... + * @param selection_left index of the first sample + * @param selection_right index of the last sample + */ + void scanBlocksToSave(const QString &base, + sample_index_t selection_left, + sample_index_t selection_right); + + /** + * create a filename (with extension) out of a given name pattern + * and index + * @param pattern the pattern for creating the filename + * @param index the index of the current file + * @return the name of the file + */ + QString createFileName(const QString &pattern, unsigned int index); + + /** + * detects the meta data of a block from splitting the description + * text of a label + * @param text the description of a label + * @param pattern a pattern describing the format of the text + * @param block a BlockInfo structure that receives artist and title + * @return true if the pattern did match, false otherwise + */ + bool detectBlockMetaData(const QString &text, + const QString &pattern, + BlockInfo &block); + + /** save the "general" section */ + void saveGeneralDocumentData(QDomElement *part); + + /** save the K3B project document data */ + void saveDocumentData(QDomElement *docElem); + + /** + * save the blocks through the saveblocks plugin + * @param selection_only if true, save only the selection + * @param out_dir output directory for saving the blocks + * @param out_pattern the pattern for creating the block filenames + * @return zero if succeeded, or error code if failed + */ + int saveBlocks(bool selection_only, + const QString &out_dir, + const QString &out_pattern); + + /** + * save the *.k3b file + * @param k3b_filename path to the *.k3b file + * @return zero if succeeded, or error code if failed + */ + int saveK3BFile(const QString &k3b_filename); + + private: + + /** the URL of the project file */ + QUrl m_url; + + /** pattern for detecting title and artist */ + QString m_pattern; + + /** if true, export only the selected range */ + bool m_selection_only; + + /** where to export the files of the tracks, subdir, same dir, ... */ + export_location_t m_export_location; + + /** overwrite existing files or create a new file name */ + overwrite_policy_t m_overwrite_policy; + + /** list of all blocks to save */ + QVector m_block_info; + }; +} + +#endif /* K3B_EXPORT_PLUGIN_H */ + +//*************************************************************************** +//*************************************************************************** + diff --git a/plugins/export_k3b/K3BExportWidget.cpp b/plugins/export_k3b/K3BExportWidget.cpp new file mode 100644 index 00000000..d2aae300 --- /dev/null +++ b/plugins/export_k3b/K3BExportWidget.cpp @@ -0,0 +1,125 @@ +/*************************************************************************** + * K3BExportWidget.cpp - widget for K3B export options in the file open dlg + * ------------------- + * begin : Thu Apr 13 2017 + * copyright : (C) 2017 by Thomas Eschenbacher + * email : Thomas.Eschenbacher@gmx.de + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#include "config.h" + +#include +#include + +#include + +#include "libkwave/String.h" + +#include "K3BExportWidget.h" + +//*************************************************************************** +Kwave::K3BExportWidget::K3BExportWidget( + QWidget *parent, + QString &pattern, + bool selection_only, + bool have_selection, + Kwave::K3BExportPlugin::export_location_t export_location, + Kwave::K3BExportPlugin::overwrite_policy_t overwrite_policy +) + :QWidget(parent), Ui::K3BExportWidgetBase() +{ + setupUi(this); + + cbLabelPattern->addItem(i18nc( + "default entry of the list of placeholder patterns in " + "the K3B export plugin (used for detecting title and artist " + "from a label description)", + "(auto detect)" + )); + foreach (const QString &p, Kwave::K3BExportPlugin::knownPatterns()) + cbLabelPattern->addItem(p); + + Q_ASSERT(cbLabelPattern); + if (pattern.trimmed().length()) + cbLabelPattern->setCurrentText(pattern.trimmed()); + else + cbLabelPattern->setCurrentIndex(0); + + // the "selection only" checkbox + Q_ASSERT(chkSelectionOnly); + if (have_selection) { + // we have a selection + chkSelectionOnly->setEnabled(true); + chkSelectionOnly->setChecked(selection_only); + } else { + // no selection -> force it to "off" + chkSelectionOnly->setEnabled(false); + chkSelectionOnly->setChecked(false); + } + + Q_ASSERT(cbExportLocation); + cbExportLocation->setCurrentIndex(static_cast(export_location)); + + Q_ASSERT(cbOverwritePolicy); + cbOverwritePolicy->setCurrentIndex(static_cast(overwrite_policy)); +} + +//*************************************************************************** +Kwave::K3BExportWidget::~K3BExportWidget() +{ +} + +//*************************************************************************** +QString Kwave::K3BExportWidget::pattern() const +{ + Q_ASSERT(cbLabelPattern); + if (!cbLabelPattern) return QString(); + + // special handling: the first entry in the list is the default pattern + // (which is "auto-detect") -> map this to empty pattern + QString p = cbLabelPattern->currentText().trimmed(); + if (p == cbLabelPattern->itemText(0)) return QString(); + + return p; +} + +//*************************************************************************** +bool Kwave::K3BExportWidget::selectionOnly() const +{ + Q_ASSERT(chkSelectionOnly); + return (chkSelectionOnly) ? chkSelectionOnly->isChecked() : false; +} + +//*************************************************************************** +Kwave::K3BExportPlugin::export_location_t + Kwave::K3BExportWidget::exportLocation() const +{ + Q_ASSERT(cbExportLocation); + return static_cast( + (cbExportLocation) ? + cbExportLocation->currentIndex() : 0 + ); +} + +//*************************************************************************** +Kwave::K3BExportPlugin::overwrite_policy_t + Kwave::K3BExportWidget::overwritePolicy() const +{ + Q_ASSERT(cbOverwritePolicy); + return static_cast( + (cbOverwritePolicy) ? + cbOverwritePolicy->currentIndex() : 0 + ); +} + +//*************************************************************************** +//*************************************************************************** diff --git a/plugins/export_k3b/K3BExportWidget.h b/plugins/export_k3b/K3BExportWidget.h new file mode 100644 index 00000000..5495e89b --- /dev/null +++ b/plugins/export_k3b/K3BExportWidget.h @@ -0,0 +1,83 @@ +/*************************************************************************** + * K3BExportWidget.h - widget for K3B export options in the file open dlg + * ------------------- + * begin : Thu Apr 13 2017 + * copyright : (C) 2017 by Thomas Eschenbacher + * email : Thomas.Eschenbacher@gmx.de + ***************************************************************************/ + +/*************************************************************************** + * * + * 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. * + * * + ***************************************************************************/ + +#ifndef K3B_EXPORT_WIDGET_H +#define K3B_EXPORT_WIDGET_H + +#include + +#include "K3BExportPlugin.h" +#include "ui_K3BExportWidgetBase.h" + +namespace Kwave +{ + class K3BExportWidget: public QWidget, public Ui::K3BExportWidgetBase + { + Q_OBJECT + public: + + /** + * Constructor + * @param widget pointer to the parent widget + * @param pattern the pattern used for detecting title and artist + * @param selection_only if true, save only the selection + * @param have_selection if true, there is a selection + * @param export_location where to export files with tracks + * @param overwrite_policy overwrite existing files or use a new name + */ + K3BExportWidget( + QWidget *widget, + QString &pattern, + bool selection_only, + bool have_selection, + Kwave::K3BExportPlugin::export_location_t export_location, + Kwave::K3BExportPlugin::overwrite_policy_t overwrite_policy + ); + + /** Destructor */ + virtual ~K3BExportWidget(); + + /** @see KPreviewWidgetBase::showPreview() */ + virtual void showPreview(const QUrl &url) + { + Q_UNUSED(url); + } + + /** @see KPreviewWidgetBase::clearPreview */ + virtual void clearPreview() + { + } + + /** returns the title/artist detection pattern (as is, not escaped) */ + QString pattern() const; + + /** returns true if only the selection should be saved */ + bool selectionOnly() const; + + /** returns export location of the files of the tracks */ + Kwave::K3BExportPlugin::export_location_t exportLocation() const; + + /** returns the file overwrite policy */ + Kwave::K3BExportPlugin::overwrite_policy_t overwritePolicy() const; + + }; +} + +#endif /* K3B_EXPORT_WIDGET_H */ + +//*************************************************************************** +//*************************************************************************** diff --git a/plugins/export_k3b/K3BExportWidgetBase.ui b/plugins/export_k3b/K3BExportWidgetBase.ui new file mode 100644 index 00000000..5569473f --- /dev/null +++ b/plugins/export_k3b/K3BExportWidgetBase.ui @@ -0,0 +1,204 @@ + + + K3BExportWidgetBase + + + + 0 + 0 + 410 + 219 + + + + + 0 + 0 + + + + + 20 + + + 0 + + + + + Input Settings + + + + 10 + + + + + + + Format of Labels: + + + false + + + + + + + + 0 + 0 + + + + <html><head/><body><p>Select a pattern for detecting title and artist from the text of a label.<br/>It currently understands the following placeholders:</p><ul style="margin-top: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; -qt-list-indent: 1;"><li style=" margin-top:12px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Courier New,courier'; font-weight:600;">[%title] </span>title of the song</li><li style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-family:'Courier New,courier'; font-weight:600;">[%artist]</span> name of the artist</li></ul></body></html> + + + true + + + false + + + + + + + + + + 0 + 0 + + + + If checked, <b>save only the blocks that overlap with the current selection</b>, otherwise the whole file. <br><i>Please note that this option is disabled if nothing is selected or the selection already covers the whole file.</i> + + + Use Selection only + + + true + + + + + + + + + + Output Settings + + + + 10 + + + 10 + + + 10 + + + + + Export Location: + + + false + + + + + + + + 0 + 0 + + + + Specify where to place the exported sound files which are used for the tracks of the audio CD. + + + false + + + + Same Directory as K3B File + + + + + Sub Directory + + + + + + + + + 0 + 0 + + + + Overwrite Policy: + + + false + + + + + + + + 0 + 0 + + + + Select whether existing files are overwritten or new file names are used when exporting the files to use as tracks of the audio CD. + + + false + + + + Overwrite Existing Files + + + + + Use new File Names + + + + + + + + + + + + + KComboBox + QComboBox +
kcombobox.h
+
+
+ + cbLabelPattern + chkSelectionOnly + cbExportLocation + cbOverwritePolicy + + + +
diff --git a/plugins/export_k3b/kwaveplugin_export_k3b.desktop.in b/plugins/export_k3b/kwaveplugin_export_k3b.desktop.in new file mode 100644 index 00000000..cfe7c2c6 --- /dev/null +++ b/plugins/export_k3b/kwaveplugin_export_k3b.desktop.in @@ -0,0 +1,11 @@ +[Desktop Entry] +Encoding=UTF-8 +Name=K3B Project Export +Name[x-test]=xxK3B Project Exportxx +Type=Service +ServiceTypes=Kwave/Plugin +X-KDE-PluginInfo-Author=Thomas Eschenbacher +X-KDE-PluginInfo-Name=export_k3b +X-KDE-PluginInfo-Version=@KWAVE_VERSION@:2.3 +X-KDE-PluginInfo-License=GPL-2.0+ +X-KDE-PluginInfo-EnabledByDefault=true diff --git a/plugins/saveblocks/SaveBlocksPlugin.cpp b/plugins/saveblocks/SaveBlocksPlugin.cpp index 075e58e1..c2f76808 100644 --- a/plugins/saveblocks/SaveBlocksPlugin.cpp +++ b/plugins/saveblocks/SaveBlocksPlugin.cpp @@ -1,749 +1,746 @@ /*************************************************************************** SaveBlocksPlugin.cpp - Plugin for saving blocks between labels ------------------- begin : Thu Mar 01 2007 copyright : (C) 2007 by Thomas Eschenbacher email : Thomas.Eschenbacher@gmx.de ***************************************************************************/ /*************************************************************************** * * * 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. * * * ***************************************************************************/ #include "config.h" #include #include #include #include #include #include #include #include "libkwave/CodecManager.h" #include "libkwave/Encoder.h" #include "libkwave/FileInfo.h" #include "libkwave/Label.h" #include "libkwave/LabelList.h" #include "libkwave/MessageBox.h" #include "libkwave/MetaDataList.h" #include "libkwave/Parser.h" #include "libkwave/SignalManager.h" #include "libkwave/String.h" #include "SaveBlocksDialog.h" #include "SaveBlocksPlugin.h" KWAVE_PLUGIN(saveblocks, SaveBlocksPlugin) //*************************************************************************** Kwave::SaveBlocksPlugin::SaveBlocksPlugin(QObject *parent, const QVariantList &args) :Kwave::Plugin(parent, args), m_url(), m_pattern(), m_numbering_mode(CONTINUE), m_selection_only(true), m_block_info() { } //*************************************************************************** Kwave::SaveBlocksPlugin::~SaveBlocksPlugin() { } //*************************************************************************** QStringList *Kwave::SaveBlocksPlugin::setup(QStringList &previous_params) { // try to interpret the previous parameters interpreteParameters(previous_params); // create the setup dialog sample_index_t selection_left = 0; sample_index_t selection_right = 0; selection(0, &selection_left, &selection_right, false); // enable the "selection only" checkbox only if there is something // selected but not everything bool selected_something = (selection_left != selection_right); bool selected_all = ((selection_left == 0) && (selection_right + 1 >= signalLength())); bool enable_selection_only = selected_something && !selected_all; QString filename = m_url.path(); QString base = findBase(filename, m_pattern); scanBlocksToSave(base, m_selection_only && enable_selection_only); QPointer dialog = new(std::nothrow) Kwave::SaveBlocksDialog( _("kfiledialog:///kwave_save_blocks"), Kwave::CodecManager::encodingFilter(), parentWidget(), QUrl::fromUserInput(signalName()), _("*.wav"), m_pattern, m_numbering_mode, m_selection_only, enable_selection_only ); if (!dialog) return 0; // connect the signals/slots from the plugin and the dialog connect(dialog, SIGNAL(sigSelectionChanged(QString, QString,Kwave::SaveBlocksPlugin::numbering_mode_t,bool)), this, SLOT(updateExample(QString,QString, Kwave::SaveBlocksPlugin::numbering_mode_t,bool))); connect(this, SIGNAL(sigNewExample(QString)), dialog, SLOT(setNewExample(QString))); dialog->setWindowTitle(description()); dialog->emitUpdate(); if (dialog->exec() != QDialog::Accepted) { delete dialog; return 0; } QStringList *list = new(std::nothrow) QStringList(); Q_ASSERT(list); if (list) { // user has pressed "OK" QString pattern; QUrl url = dialog->selectedUrl(); if (url.isEmpty()) { delete dialog; delete list; return 0; } QString name = url.path(); QFileInfo path(name); // add the correct extension if necessary if (!path.suffix().length()) { QString ext = dialog->selectedExtension(); QStringList extensions = ext.split(_(" ")); ext = extensions.first(); name += ext.mid(1); path = name; url.setPath(name); } name = Kwave::Parser::escape(name); pattern = Kwave::Parser::escape(dialog->pattern()); int mode = static_cast(dialog->numberingMode()); bool selection_only = (enable_selection_only) ? dialog->selectionOnly() : m_selection_only; *list << name; *list << pattern; *list << QString::number(mode); *list << QString::number(selection_only); emitCommand(_("plugin:execute(saveblocks,") + name + _(",") + pattern + _(",") + QString::number(mode) + _(",") + QString::number(selection_only) + _(")") ); } if (dialog) delete dialog; return list; } //*************************************************************************** QString Kwave::SaveBlocksPlugin::createDisplayList( const QStringList &list, unsigned int max_entries) const { if (!max_entries || list.isEmpty()) return QString(); QString retval; unsigned int count = 0; foreach (const QString &entry, list) { if (count == 0) // first entry retval = _("

"); if (count < max_entries) retval += entry + _("
"); else if (count == max_entries) retval += i18n("...") + _("
"); if (++count > max_entries) break; } return retval; } //*************************************************************************** int Kwave::SaveBlocksPlugin::start(QStringList ¶ms) { qDebug("SaveBlocksPlugin::start()"); // interpret the parameters int result = interpreteParameters(params); if (result) return result; QString filename = m_url.path(); QFileInfo file(filename); QString path = file.absolutePath(); QString ext = file.suffix(); QString base = findBase(filename, m_pattern); QByteArray sep("/"); // determine the selection settings sample_index_t selection_left = 0; sample_index_t selection_right = 0; selection(0, &selection_left, &selection_right, false); bool selected_something = (selection_left != selection_right); - bool selected_all = ((selection_left == 0) && - (selection_right+1 >= signalLength())); + bool selected_all = ( (selection_left == 0) && + ((selection_right + 1) >= signalLength()) ); bool enable_selection_only = selected_something && !selected_all; bool selection_only = enable_selection_only && m_selection_only; - - if (selection_only) { - selection(0, &selection_left, &selection_right, true); - } else { + if (!selection_only) { selection_left = 0; selection_right = signalLength() - 1; } // get the index range scanBlocksToSave(base, selection_only); unsigned int count = m_block_info.count(); unsigned int first = firstIndex(path, base, ext, m_pattern, m_numbering_mode, count); // qDebug("m_url = '%s'", m_url.prettyURL().local8Bit().data()); // qDebug("m_pattern = '%s'", m_pattern.local8Bit().data()); // qDebug("m_numbering_mode = %d", (int)m_numbering_mode); // qDebug("selection_only = %d", selection_only); // qDebug("indices = %u...%u (count=%u)", first, first+count-1,count); // remember the original file info and determine the list of unsupported // properties, we need that later to avoid that the signal manager // complains on saving each and every block, again and again... const Kwave::FileInfo orig_file_info(signalManager().metaData()); Kwave::FileInfo file_info(orig_file_info); QList unsupported_properties; { QString mimetype = Kwave::CodecManager::whatContains(m_url); Kwave::Encoder *encoder = Kwave::CodecManager::encoder(mimetype); if (encoder) { unsupported_properties = encoder->unsupportedProperties( file_info.properties().keys()); delete encoder; } } // iterate over all blocks to check for overwritten files and missing dirs QStringList overwritten_files; QStringList missing_dirs; for (unsigned int i = first; i < (first + count); i++) { QString name = createFileName(base, ext, m_pattern, i, count, first + count - 1); QString display_name = Kwave::Parser::unescape(name); // split the name into directory and file name name = QString::fromLatin1(QUrl::toPercentEncoding(display_name, sep)); QUrl url = m_url.adjusted(QUrl::RemoveFilename); url.setPath(url.path(QUrl::FullyEncoded) + name, QUrl::StrictMode); QString filename = url.path(); QFileInfo file_info(filename); // check for potentially overwritten file if (file_info.exists()) overwritten_files += Kwave::Parser::unescape(display_name); // check for missing subdirectory if (!file_info.dir().exists()) { QFileInfo inf(display_name); QString missing_dir = inf.path(); if (!missing_dirs.contains(missing_dir)) missing_dirs += missing_dir; } } // inform about overwritten files if (!overwritten_files.isEmpty()) { // ask the user for confirmation if he really wants to overwrite... if (Kwave::MessageBox::warningYesNo(parentWidget(), _("") + i18n("This would overwrite the following file(s): %1" \ "Do you really want to continue?", createDisplayList(overwritten_files, 5)) + _("") ) != KMessageBox::Yes) { return -1; } } // handle missing directories if (!missing_dirs.isEmpty()) { // ask the user if he wants to continue and create the directory if (Kwave::MessageBox::warningContinueCancel(parentWidget(), i18n("The following directories do not exist: %1" "Do you want to create them and continue?", createDisplayList(missing_dirs, 5)), QString(), QString(), QString(), _("saveblocks_create_missing_dirs") ) != KMessageBox::Continue) { return -1; } // create all missing directories QUrl base_url = m_url.adjusted(QUrl::RemoveFilename); foreach (const QString &missing, missing_dirs) { QUrl url(base_url); url.setPath( base_url.path(QUrl::FullyEncoded) + QString::fromLatin1(QUrl::toPercentEncoding(missing)), QUrl::StrictMode ); QString path = url.path(); QDir dir; if (!dir.mkpath(path)) qWarning("creating path '%s' failed", DBG(path)); } } // save the current selection, we have to restore it afterwards! sample_index_t saved_selection_left = 0; sample_index_t saved_selection_right = 0; selection(0, &saved_selection_left, &saved_selection_right, false); // now we can loop over all blocks and save them sample_index_t block_start; sample_index_t block_end = 0; Kwave::LabelList labels(signalManager().metaData()); Kwave::LabelListIterator it(labels); Kwave::Label label = it.hasNext() ? it.next() : Kwave::Label(); for (unsigned int index = first;;) { block_start = block_end; block_end = (label.isNull()) ? signalLength() : label.pos(); if ((selection_left < block_end) && (selection_right > block_start)) { // found a block to save... Q_ASSERT(index < first + count); sample_index_t left = block_start; sample_index_t right = block_end - 1; if (left < selection_left) left = selection_left; if (right > selection_right) right = selection_right; Q_ASSERT(right > left); if (right <= left) break; // zero-length ? // select the range of samples selectRange(left, right - left + 1); // determine the filename QString name = createFileName(base, ext, m_pattern, index, count, first + count - 1); name = Kwave::Parser::unescape(name); // use URL encoding for the filename name = QString::fromLatin1(QUrl::toPercentEncoding(name, sep)); QUrl url = m_url.adjusted(QUrl::RemoveFilename); url.setPath(url.path(QUrl::FullyEncoded) + name, QUrl::StrictMode); // enter the title of the block into the meta data if supported if (!unsupported_properties.contains(INF_NAME)) { QString title = orig_file_info.get(INF_NAME).toString(); int idx = index - first; if ((idx >= 0) && (idx < m_block_info.count())) { QString block_title = m_block_info[idx].m_title; if (block_title.length()) title = title + _(", ") + block_title; } file_info.set(INF_NAME, QVariant(title)); signalManager().metaData().replace( Kwave::MetaDataList(file_info)); } qDebug("saving %9lu...%9lu -> '%s'", static_cast(left), static_cast(right), DBG(url.toDisplayString())); if (signalManager().save(url, true) < 0) break; // if there were unsupported properties, the user might have been // asked whether it is ok to continue or not. If he answered with // "Cancel", we do not reach this point, otherwise we can continue // and prevent any further annoying questions by removing all // unsupported file info before the next run... if ((index == first) && !unsupported_properties.isEmpty()) { foreach (const Kwave::FileProperty &p, unsupported_properties) { file_info.set(p, QVariant()); } signalManager().metaData().replace( Kwave::MetaDataList(file_info)); } // increment the index for the next filename index++; } if (label.isNull()) break; label = (it.hasNext()) ? it.next() : Kwave::Label(); } // restore the original file info signalManager().metaData().replace( Kwave::MetaDataList(orig_file_info)); // restore the previous selection selectRange(saved_selection_left, (saved_selection_left != saved_selection_right) ? (saved_selection_right - saved_selection_left + 1) : 0); return result; } //*************************************************************************** int Kwave::SaveBlocksPlugin::interpreteParameters(QStringList ¶ms) { bool ok; QString param; // evaluate the parameter list if (params.count() != 4) { return -EINVAL; } // the selected URL m_url = QUrl::fromUserInput(Kwave::Parser::unescape(params[0])); if (!m_url.isValid()) return -EINVAL; // filename pattern m_pattern = Kwave::Parser::unescape(params[1]); if (!m_pattern.length()) return -EINVAL; // numbering mode param = params[2]; int mode = param.toInt(&ok); Q_ASSERT(ok); if (!ok) return -EINVAL; if ((mode != CONTINUE) && (mode != START_AT_ONE)) return -EINVAL; m_numbering_mode = static_cast(mode); // flag: save only the selection param = params[3]; m_selection_only = (param.toUInt(&ok) != 0); Q_ASSERT(ok); if (!ok) return -EINVAL; return 0; } //*************************************************************************** void Kwave::SaveBlocksPlugin::scanBlocksToSave(const QString &base, bool selection_only) { sample_index_t selection_left, selection_right; sample_index_t block_start; sample_index_t block_end = 0; QString block_title; Kwave::LabelList labels(signalManager().metaData()); Kwave::LabelListIterator it(labels); Kwave::Label label = (it.hasNext()) ? it.next() : Kwave::Label(); if (selection_only) { selection(0, &selection_left, &selection_right, true); } else { selection_left = 0; selection_right = signalLength() - 1; } // get the title of the whole file, in case that a block does not have // an own title FileInfo info(signalManager().metaData()); QString file_title = info.get(INF_NAME).toString(); // fallback: if there is no INF_NAME either, fall back to the file // name as last resort if (!file_title.length()) file_title = base; m_block_info.clear(); QString prev_title; for (;;) { block_start = block_end; block_end = (label.isNull()) ? signalLength() : label.pos(); block_title = prev_title; prev_title = (label.isNull()) ? file_title : label.name(); if ((block_end > selection_left) && (block_start <= selection_right)) { BlockInfo block; block.m_start = block_start; block.m_length = block_end - block_start; block.m_title = block_title; if (!block.m_title.length()) block.m_title = file_title; m_block_info.append(block); } if (label.isNull()) break; label = (it.hasNext()) ? it.next() : Kwave::Label(); } } //*************************************************************************** QString Kwave::SaveBlocksPlugin::createFileName(const QString &base, const QString &ext, const QString &pattern, unsigned int index, int count, int total) { QString p = QRegExp::escape(pattern); QString nr; // format the "index" parameter QRegExp rx_nr(_("(\\\\\\[%(\\d*)nr\\\\\\])"), Qt::CaseInsensitive); while (rx_nr.indexIn(p) >= 0) { QString format = rx_nr.cap(1); format = format.mid(2, format.length() - 6); QString ex = _("(\\\\\\[") + format + _("nr\\\\\\])"); QRegExp rx(ex, Qt::CaseInsensitive); format += _("u"); p.replace(rx, nr.sprintf(format.toLatin1(), index)); } // format the "count" parameter QRegExp rx_count(_("(\\\\\\[%\\d*count\\\\\\])"), Qt::CaseInsensitive); while (rx_count.indexIn(p) >= 0) { if (count >= 0) { QString format = rx_count.cap(1); format = format.mid(2, format.length() - 9); QString ex = _("(\\\\\\[") + format + _("count\\\\\\])"); QRegExp rx(ex, Qt::CaseInsensitive); format += _("u"); p.replace(rx, nr.sprintf(format.toLatin1(), count)); } else { p.replace(rx_count, _("(\\d+)")); } } // format the "total" parameter QRegExp rx_total(_("(\\\\\\[%\\d*total\\\\\\])"), Qt::CaseInsensitive); while (rx_total.indexIn(p) >= 0) { if (total >= 0) { QString format = rx_total.cap(1); format = format.mid(2, format.length() - 9); QString ex = _("(\\\\\\[") + format + _("total\\\\\\])"); QRegExp rx(ex, Qt::CaseInsensitive); format += _("u"); p.replace(rx, nr.sprintf(format.toLatin1(), total)); } else { p.replace(rx_total, _("(\\d+)")); } } // format the "filename" parameter QRegExp rx_filename(_("\\\\\\[%filename\\\\\\]"), Qt::CaseInsensitive); if (rx_filename.indexIn(p) >= 0) { p.replace(rx_filename, QRegExp::escape(base)); } // support for file info QRegExp rx_fileinfo( _("\\\\\\[%(\\d*)fileinfo\\\\\\{([\\w\\s]+)\\\\\\}\\\\\\]"), Qt::CaseInsensitive ); Kwave::FileInfo info(signalManager().metaData()); while (rx_fileinfo.indexIn(p) >= 0) { const QString format = rx_fileinfo.cap(1); const QString id = rx_fileinfo.cap(2); QString value; FileProperty property = info.fromName(id); if (property != Kwave::INF_UNKNOWN) { QVariant val = info.get(property); if (!val.isNull()) { // we have a property value value = val.toString(); // check for format (desired minimum string length) bool ok = false; int len = format.toUInt(&ok); if ((len > 0) && ok) { Kwave::FileInfo::Flags flags = info.flags(property); if (flags & Kwave::FileInfo::FP_FORMAT_NUMERIC) { // numeric format, pad with leading zeros or spaces QString pad = (format.startsWith(QLatin1Char('0'))) ? _("0") : _(" "); while (value.length() < len) value = pad + value; } else { // string format, pad with trailing spaces while (value.length() < len) value = value + _(" "); } } value = Kwave::Parser::escapeForFileName(value); } } QString ex(_("(\\\\\\[%") + format + _("fileinfo\\\\\\{") + id + _("\\\\\\}\\\\\\])")); QRegExp rx(ex, Qt::CaseInsensitive); p.replace(rx, value); } // format the "title" parameter QRegExp rx_title(_("\\\\\\[%title\\\\\\]"), Qt::CaseInsensitive); if (rx_title.indexIn(p) >= 0) { QString title; int idx = (index - 1) - (total - count); if ((idx >= 0) && (idx < m_block_info.count())) title = m_block_info[idx].m_title; if (title.length()) { title = Kwave::Parser::escapeForFileName(title); p.replace(rx_title, title); } } if (ext.length()) p += _(".") + ext; // sanitize the filename/path, make sure that there are no spaces // before and after all path separators QString sep = _("/"); QRegExp rx_sep(_("\\s*") + sep + _("\\s*")); p.replace(rx_sep, sep); return p; } //*************************************************************************** unsigned int Kwave::SaveBlocksPlugin::firstIndex(const QString &path, const QString &base, const QString &ext, const QString &pattern, Kwave::SaveBlocksPlugin::numbering_mode_t mode, unsigned int count) { unsigned int first = 1; switch (mode) { case START_AT_ONE: first = 1; break; case CONTINUE: { QDir dir(path, _("*")); QStringList files; files = dir.entryList(); for (unsigned int i = first; i < (first + count); i++) { QString name = createFileName(base, ext, pattern, i, -1, -1); QRegExp rx(_("^(") + name + _(")$"), Qt::CaseInsensitive); QStringList matches = files.filter(rx); if (matches.count() > 0) first = i + 1; } break; } } return first; } //*************************************************************************** QString Kwave::SaveBlocksPlugin::findBase(const QString &filename, const QString &pattern) { QFileInfo file(filename); QString name = file.fileName(); QString base = file.completeBaseName(); QString ext = file.suffix(); // convert the pattern into a regular expression in order to check if // the current name already is produced by the current pattern // \[%[0-9]?nr\] -> \d+ // \[%[0-9]?count\] -> \d+ // \[%[0-9]?total\] -> \d+ // \[%filename\] -> base // \[%fileinfo\] -> . // \[%title\] -> . QRegExp rx_nr(_("\\\\\\[%\\d*nr\\\\\\]"), Qt::CaseInsensitive); QRegExp rx_count(_("\\\\\\[%\\d*count\\\\\\]"), Qt::CaseInsensitive); QRegExp rx_total(_("\\\\\\[%\\d*total\\\\\\]"), Qt::CaseInsensitive); QRegExp rx_filename(_("\\\\\\[%filename\\\\\\]"), Qt::CaseInsensitive); QRegExp rx_fileinfo(_("\\\\\\[%fileinfo\\\\\\]"), Qt::CaseInsensitive); QRegExp rx_title(_("\\\\\\[%title\\\\\\]"), Qt::CaseInsensitive); QString p = QRegExp::escape(pattern); int idx_nr = rx_nr.indexIn(p); int idx_count = rx_count.indexIn(p); int idx_total = rx_total.indexIn(p); int idx_filename = rx_filename.indexIn(p); int idx_fileinfo = rx_fileinfo.indexIn(p); int idx_title = rx_fileinfo.indexIn(p); p.replace(rx_nr, _("(\\d+)")); p.replace(rx_count, _("(\\d+)")); p.replace(rx_total, _("(\\d+)")); p.replace(rx_filename, _("(.+)")); p.replace(rx_fileinfo, _("(.+)")); p.replace(rx_title, _("(.+)")); int max = 0; for (int i = 0; i < pattern.length(); i++) { if (idx_nr == max) max++; if (idx_count == max) max++; if (idx_total == max) max++; if (idx_filename == max) max++; if (idx_fileinfo == max) max++; if (idx_title == max) max++; if (idx_nr > max) idx_nr--; if (idx_count > max) idx_count--; if (idx_total > max) idx_total--; if (idx_filename > max) idx_filename--; if (idx_fileinfo > max) idx_fileinfo--; if (idx_title > max) idx_title--; } if (ext.length()) p += _(".") + ext; QRegExp rx_current(p, Qt::CaseInsensitive); if (rx_current.indexIn(name) >= 0) { // filename already produced by this pattern base = rx_current.cap(idx_filename + 1); } return base; } //*************************************************************************** QString Kwave::SaveBlocksPlugin::firstFileName(const QString &filename, const QString &pattern, Kwave::SaveBlocksPlugin::numbering_mode_t mode, bool selection_only) { QFileInfo file(filename); QString path = file.absolutePath(); QString ext = file.suffix(); QString base = findBase(filename, pattern); // now we have a new name, base and extension // -> find out the numbering, min/max etc... scanBlocksToSave(base, selection_only); unsigned int count = m_block_info.count(); unsigned int first = firstIndex(path, base, ext, pattern, mode, count); unsigned int total = first + count - 1; // create the complete filename, including extension but without path return createFileName(base, ext, pattern, first, count, total); } //*************************************************************************** void Kwave::SaveBlocksPlugin::updateExample(const QString &filename, const QString &pattern, Kwave::SaveBlocksPlugin::numbering_mode_t mode, bool selection_only) { QString example = firstFileName(filename, pattern, mode, selection_only); emit sigNewExample(Kwave::Parser::unescape(example)); } //*************************************************************************** #include "SaveBlocksPlugin.moc" //*************************************************************************** //*************************************************************************** diff --git a/scripts/screenshots.kwave b/scripts/screenshots.kwave index 0de3ff83..5fcfab99 100644 --- a/scripts/screenshots.kwave +++ b/scripts/screenshots.kwave @@ -1,357 +1,369 @@ ############################################################################# ## scripts/screenshots.kwave - script for making screenshot for ${LANG} ## ------------------- ## begin : Sat Feb 21 2015 ## copyright : (C) 2015 by Thomas Eschenbacher ## email : Thomas.Eschenbacher@gmx.de ############################################################################# # ############################################################################# ## # ## 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. # ## # ############################################################################# # # open the example wav file # hint: this file is generated from samples/sample.opus by applying # scripts/create-testfile.kwave # open(/var/tmp/example.wav) # # screenshot of MDI mode # main-mdi: window:resize(Kwave::TopWidget,900, 600) select_gui_type(MDI) # first sub window: test.ogg (foreground) view:zoom_all() selectnone() selectnextlabels() selectnextlabels() fileinfo(Filename, test.ogg) # second sub window: sample.flac (minimized) open(/var/tmp/example.wav) view:zoom_all() fileinfo(Filename, sample.flac) window:minimize() # third sub window: example.wav (background) open(/var/tmp/example.wav) fileinfo(Filename, example.wav) delete_track(0) view:zoom_all() selectnone() window:next_sub() window:resize(Kwave::TopWidget,900, 640) delayed(500,window:screenshot(Kwave::TopWidget, /var/tmp/screenshots/${LANG}/kwave-gui-mdi.png)) sync() # # screenshot of TAB mode # main-tab: select_gui_type(TAB) window:next_sub() selectnone() selectnextlabels() selectnextlabels() delayed(500,window:screenshot(Kwave::TopWidget, /var/tmp/screenshots/${LANG}/kwave-gui-tab.png)) sync() undo_all() close() undo_all() close() undo_all() # # screenshots of SDI mode # main-sdi: select_gui_type(SDI) sync() # first sub window: sample.flac (background) window:resize(Kwave::TopWidget,820, 440) fileinfo(Filename, sample.flac) selectnone() selectnextlabels() selectnextlabels() view:zoom_selection() selectnone() delayed(500,window:screenshot(Kwave::TopWidget, /var/tmp/screenshots/${LANG}/01-kwave-gui-sdi.png)) sync() undo_all() # second sub window: test.ogg (middle) fileinfo(Filename, test.ogg) view:zoom_all() delete_track(0) selectnone() view:zoom_in() delayed(500,window:screenshot(Kwave::TopWidget, /var/tmp/screenshots/${LANG}/02-kwave-gui-sdi.png)) sync() undo_all() # third window: example.wav (foreground) fileinfo(Filename, example.wav) view:zoom_all() selectnone() selectnextlabels() selectnextlabels() delayed(500,window:mousemove(Kwave::TrackView,350,80)) delayed(500,window:screenshot(Kwave::TopWidget, /var/tmp/screenshots/${LANG}/03-kwave-gui-sdi.png)) sync() undo_all() # # main screen, one single file, SDI mode # main: select_gui_type(SDI) window:resize(Kwave::TopWidget,900, 640) view:zoom_all() plugin:execute(selectrange,2,2,25,10) expandtolabel() delayed(1000,window:mousemove(Kwave::TrackView,350,80)) delayed(1000,window:screenshot(Kwave::TopWidget, /var/tmp/screenshots/${LANG}/kwave-main.png)) sync() # # screenshot of the Edit Label dialog # edit-label: delayed(1000,window:screenshot(Kwave::LabelPropertiesWidget, /var/tmp/screenshots/${LANG}/kwave-edit-label.png)) delayed(100,window:close(Kwave::LabelPropertiesWidget)) label:edit(0) sync() # # screenshot of the Help/About dialog # plugin-about: delayed(2000,window:screenshot(Kwave::AboutDialog, /var/tmp/screenshots/${LANG}/kwave-plugin-about.png)) delayed(100,window:close(Kwave::AboutDialog)) plugin:execute(about) # # screenshot of the AmplifyFree dialog # plugin-amplifyfree: selectall() delayed(1000,window:resize(Kwave::AmplifyFreeDialog, 400, 300)) delayed(500,window:click(Kwave::CurveWidget, 120, 50)) delayed(500,window:screenshot(Kwave::AmplifyFreeDialog, /var/tmp/screenshots/${LANG}/kwave-plugin-amplifyfree.png)) delayed(100,window:close(Kwave::AmplifyFreeDialog)) plugin:setup(amplifyfree,Amplify Free,spline,0,0,0.68,0.47,1,1) sync() # # screenshot of the BandPass dialog # plugin-band_pass: selectall() delayed(500,window:screenshot(Kwave::BandPassDialog, /var/tmp/screenshots/${LANG}/kwave-plugin-band_pass.png)) delayed(100,window:close(Kwave::BandPassDialog)) plugin:setup(band_pass,1337,1971) sync() # # screenshot of the MP3 codec setup dialog # plugin-codec_mp3: selectall() delayed(500,window:screenshot(Kwave::MP3EncoderDialog, /var/tmp/screenshots/${LANG}/kwave-plugin-codec_mp3.png)) delayed(100,window:close(Kwave::MP3EncoderDialog)) plugin:setup(codec_mp3) sync() +# +# screenshot of the K3B export setup dialog +# +plugin-export_k3b: + selectall() + select_track:off(1) + delayed(500,window:screenshot(Kwave::K3BExportDialog, /var/tmp/screenshots/${LANG}/kwave-plugin-export_k3b.png)) + delayed(100,window:close(Kwave::K3BExportDialog)) + plugin:setup(export_k3b) + sync() + select_track:on(1) + # # screenshot of the File Info dialog # plugin-fileinfo: delayed(1000,window:screenshot(Kwave::FileInfoDialog, /var/tmp/screenshots/${LANG}/kwave-plugin-fileinfo.png)) delayed(100,window:close(Kwave::FileInfoDialog)) plugin:setup(fileinfo) sync() # # screenshot of the Goto plugin # plugin-goto: delayed(1000,window:screenshot(Kwave::GotoDialog, /var/tmp/screenshots/${LANG}/kwave-plugin-goto.png)) delayed(100,window:close(Kwave::GotoDialog)) plugin:setup(goto, 2, 42) sync() # # screenshot of the Insert At plugin # plugin-insert_at: delayed(1000,window:screenshot(Kwave::GotoDialog, /var/tmp/screenshots/${LANG}/kwave-plugin-insert_at.png)) delayed(100,window:close(Kwave::GotoDialog)) plugin:setup(insert_at, 2, 42) sync() # # screenshot of the Low Pass dialog # plugin-lowpass: selectall() delayed(1000,window:screenshot(Kwave::LowPassDialog, /var/tmp/screenshots/${LANG}/kwave-plugin-lowpass.png)) delayed(100,window:close(Kwave::LowPassDialog)) plugin:setup(lowpass, 2342) sync() # # screenshot of the Noise Generator dialog # plugin-noise: selectall() delayed(1000,window:screenshot(Kwave::NoiseDialog, /var/tmp/screenshots/${LANG}/kwave-plugin-noise.png)) delayed(100,window:close(Kwave::NoiseDialog)) plugin:setup(noise, 0.22, 1) sync() # # screenshot of the Memory Setup dialog # plugin-memory: delayed(1000,window:screenshot(Kwave::MemoryDialog, /var/tmp/screenshots/${LANG}/kwave-plugin-memory.png)) delayed(100,window:close(Kwave::MemoryDialog)) plugin:setup(memory, 1,1024,1,1,512,/var/tmp,512) sync() # # screenshot of the New File dialog # plugin-newsignal: delayed(1000,window:screenshot(Kwave::NewSignalDialog, /var/tmp/screenshots/${LANG}/kwave-plugin-newsignal.png)) delayed(100,window:close(Kwave::NewSignalDialog)) plugin:setup(newsignal, 3660300, 44100, 16, 2, 1) sync() # # screenshot of the Notch Filter dialog # plugin-notch_filter: selectall() delayed(1000,window:screenshot(Kwave::NotchFilterDialog, /var/tmp/screenshots/${LANG}/kwave-plugin-notch_filter.png)) delayed(100,window:close(Kwave::NotchFilterDialog)) plugin:setup(notch_filter, 880, 230) sync() # # screenshot of the Pitch Shift dialog # plugin-pitch_shift: selectall() delayed(1000,window:screenshot(Kwave::PitchShiftDialog, /var/tmp/screenshots/${LANG}/kwave-plugin-pitch_shift.png)) delayed(100,window:close(Kwave::PitchShiftDialog)) plugin:setup(pitch_shift,1.23, 4, 1) sync() # # screenshot of the Playback Setup dialog # plugin-playback: delayed(1000,window:screenshot(Kwave::PlayBackDialog, /var/tmp/screenshots/${LANG}/kwave-plugin-playback.png)) delayed(100,window:close(Kwave::PlayBackDialog)) plugin:setup(playback, 2,"null sink|sound_card||Null Output|sound_note",2,0,16) sync() # # screenshot of the Record dialog # plugin-record: delayed(1000,window:screenshot(Kwave::RecordDialog, /var/tmp/screenshots/${LANG}/kwave-plugin-record.png)) delayed(100,window:close(Kwave::RecordDialog)) plugin:setup(record,2,1,20,1,300,0,2015-02-22T08:43:00,1,30,0,3,0,50,0,5,0,5,DSNOOP-Plugin|sound_note,2,44100,0,16,401,64,12) sync() # # screenshot of the Save Blocks dialog # plugin-saveblocks: selectnone() fileinfo(Filename, example.wav) selectnone() delayed(1500,window:screenshot(Kwave::SaveBlocksDialog, /var/tmp/screenshots/${LANG}/kwave-plugin-saveblocks.png)) delayed(100,window:close(Kwave::SaveBlocksDialog)) plugin:setup(saveblocks,/var/tmp/screenshots/example.wav,[\%filename\]\-\[\%04nr\],0,1) sync() # # screenshot of the Select Range dialog # plugin-selectrange: plugin:execute(selectrange,2,2,42,11) fileinfo(Filename, example.wav) delayed(1500,window:screenshot(Kwave::SelectRangeDialog, /var/tmp/screenshots/${LANG}/kwave-plugin-selectrange.png)) delayed(100,window:close(Kwave::SelectRangeDialog)) plugin:setup(selectrange,2,2,42,11) sync() # # screenshot of the Sonagram window # plugin-sonagram: plugin:execute(selectrange,2,2,33,10) expandtolabel() select_track:none() select_track:on(0) plugin:execute(sonagram, 1024, hamming, 1, 1, 0) delayed(2000,window:click(Kwave::ImageView, 396, 259)) delayed(100,window:screenshot(Kwave::SonagramWindow, /var/tmp/screenshots/${LANG}/kwave-plugin-sonagram-window.png)) delayed(100,window:sendkey(Kwave::SonagramWindow, Ctrl+W)) sync() # # screenshot of the Sonagram dialog # plugin-sonagram-setup: plugin:execute(selectrange,2,2,33,10) expandtolabel() select_track:none() select_track:on(0) delayed(1000,window:screenshot(Kwave::SonagramDialog, /var/tmp/screenshots/${LANG}/kwave-plugin-sonagram-setup.png)) delayed(100,window:close(Kwave::SonagramDialog)) plugin:setup(sonagram, 1024, hamming, 1, 1, 0) sync() # # screenshot of the String Enter dialog # plugin-stringenter: delayed(1000,window:screenshot(Kwave::StringEnterDialog, /var/tmp/screenshots/${LANG}/kwave-plugin-stringenter.png)) delayed(100,window:close(Kwave::StringEnterDialog)) plugin:setup(stringenter, help\(\)) sync() # # screenshot of the Volume dialog # plugin-volume: selectall() select_track:all() delayed(1000,window:screenshot(Kwave::VolumeDialog, /var/tmp/screenshots/${LANG}/kwave-plugin-volume.png)) delayed(100,window:close(Kwave::VolumeDialog)) plugin:setup(volume, 0.707946, 2) sync() end: selectnone() close() quit() # Hint: sometimes useful to find out the class name of a window # delayed(1000,plugin:setup(debug,dump_windows)) ### EOF ###