'''[http://sqlitestudio.pl/tclmixer/%|%TclMixer]''', by [Googie], provides [http://www.libsdl.org/projects/SDL_mixer/%|%SDL_mixer] ([SDL]) bindings for Tcl. It can allows to play multiple sounds simultaneously using a built-in software mixer. ** Attributes ** website: http://sqlitestudio.pl/tclmixer/ license: [LGPL] (same as SDL) latest release: 1.2.3 ** Description ** TclMixer supports following sound formats: WAV/RIFF, MP3, OGG, MID (midi), MOD (including standart MOD modules, but also S3M, IT, XM). There are basic effects implemented, which would be very useful, such as individual sound volume level, 3D sound source positioning, stereo balance, fading in/out and sound source distance. All these goodies closed in well known, simple Tcl syntax. To make this extension work, end-user has to got installed SDL [http://www.libsdl.org] (in version 1.2.x) and SDL_mixer [http://www.libsdl.org/projects/sdl_mixer/] (in version 1.2.x), which are quiet famous and presents on most Unix desktop machines (in future tclmixer.so could be linked statically with these libraries to takes dependencies off). Generaly, it's low-latency alternative for [Snack] package. It's excellent for a game sound system, but not only. [PYK] 2015-10-13: Although `test/test.tcl` file in the latest release is is outdated and no longer works because `tclmixer::setCallback` doesn't exist, Tclmixer itself is functional. See examples below that do work. ** News ** 2005-03-28: There is also Windows binary package available at extension homepage! : [In-Hak Min] TclMixer 1.2.3 Win32 binary : http://tcltk.co.kr/?q=node/1318 : [Googie] 2009-05-01 Can I put this win32 binary at TclMixer homepage? : [In-Hak Min] Of course. ^_^ ** Examples ** Get some supported sound file. If it's some effect (gun shot, or explosion or sth) load it as short sound (which gives very low latency): ====== #!/usr/bin/env wish package require TclMixer set snd [tclmixer::sound file.] tclmixer::play $snd ====== if file is big (usually some music), then load it as long sound, to prevent loading it into memory: ====== #!/usr/bin/env wish package require TclMixer set music [tclmixer::music file.] tclmixer::play $music ====== There is 'wish' used, not 'tclsh', becouse we need some event loop, since SDL_mixer hasn't its own. If you want to use 'tclsh', you need to create some event loop, to let SDL_mixer play whole sound. You can use CALLBACK mechanism: ====== #!/usr/bin/env tclsh package require TclMixer set done 0 proc musicFinished {} { variable done set done 1 } # Arrange for [musicFinished] to be called when he music is done tclmixer::mixConfig -music [namespace current]::musicFinished set music [tclmixer::music file.] tclmixer::play $music while {!$done} { after 500 } ====== [PYK] 2015-10-13: `[vwait]` can not be used in the case, because the callblacks registered via `tclmixer::mixConfig` are called in a thread created by [SDL], but access the Tcl interpreter in the other thread, which is a generally a no-no. However, the convention illustrated above should work as long as nothing else sets the semaphore variable [chw] 2015-10-13: Maybe the tclmixer in AndroWish is of help here (see http://www.androwish.org/index.html/dir?ci=f34be1dc90d3e7f7&name=jni/tclmixer). It should fix many threading issues and hopefully still compile on non Androids, too. <> Package | Multimedia | Sound | Music