Detailed changes v1.0.28 v1.0.29

From AlsaProject
Jump to: navigation, search

Contents

Detailed changelog between 1.0.26 and 1.0.29 releases

Changelog between 1.0.28 and 1.0.29 releases

alsa-python

Core

- Release v1.0.29
- setup.py: indent changes

pyalsa.alsaseq module

- alsaseq: fix memory leaks
Fix a bunch of dangling reference issues. Also switch to Py_BuildValue
where appropriate, since that makes it easier to build complex
dictionary/tuple structures without leaking integer/string references.
- alsaseq: remove dead code in Sequencer_set_clientname()

Detailed changelog between 1.0.28 and 1.0.29 releases

Changelog between 1.0.28 and 1.0.29 releases

alsa-lib

Core

- Release v1.0.29
- conf/ucm: GoogleNyan: Add configuration
Taken from the ChromeOS sources, this configuration should apply to all
Nyan boards from Google, so far HP Chromebook 14 (nyan-blaze) and Acer
Chromebook 13 (nyan-big).
- conf/ucm: PAZ00: add Toshiba AC100/Dynabook AZ new config
Recent mainline kernels threat Toshiba AC100 audio hardware as hw:PAZ00
vs old hw:tegraalc5632.
This patch adds config files for new hw name and include them to
makefiles.

Control API

- control: complement comment for subscribe API
When minus value is given as a parameter, the API returns whether
the caller has already subscribed or not.
This commit adds a comment about this so as better documentation.
- Remove unused hostname resolution in shm plugins and aserver
PCM and control shm plugins and aserver have some codes to resolve the
host address and check whether it's a local host although the given
address is never used. In addition, the code contains gethostbyname()
that is known to be obsoleted. So, let's get rid of all these unused
codes.
The host configuration item is still accepted (but just ignored) for
keeping the compatibility.
- control: enable octal and hexadecimal parse
Use zero-base for strtol(), so get_integer() and get_integer64()
can parse decimal, octal and hexadecimal data from input string.
- control: return negative value in case of error

HWDEP API

- hwdep: add OXFW driver support
Linux 3.19 newly support this driver. By hardware dependent interface,
userspace applications can get hardware information, lock/unlock kernel
streaming and receive lock status event.
- hwdep: add missing declaration for snd_hwdep_poll_descriptors_count()
The alsa-lib has 'snd_hwdep_poll_descriptors_count()' but hwdep.h has no
declaration for the function. No applications can call the function just
by including the header.
This commit adds a line to the file for this function.
- Sync enum snd_hwdep_iface_t with include/asound/asound.h
Some members in this enumerated type has not updated for 9 years, although
kernel-drivers added them during this period. This commit adds them following
to a commit 87df9f3 'sync include/asound/asound.h with 3.17-rc1 kernel'.

Mixer API

- mixer: Fix unused parameter warnings
mixer_simple.h:35:64: warning: unused parameter 'mixer' [-Wunused-parameter]
static inline int snd_mixer_simple_basic_register(snd_mixer_t *mixer,
^
mixer_simple.h:36:40: warning: unused parameter 'options' [-Wunused-parameter]
struct snd_mixer_selem_regopt *options,
^
mixer_simple.h:37:29: warning: unused parameter 'classp' [-Wunused-parameter]
snd_mixer_class_t **classp)
^
- mixer: Fix inclusion of config.h
config.h wasn't read or read too late in some files in src/mixer.
- mixer: Fix missing hctl handle free in snd_mixer_attach_hctl()
Yet another missing piece.
Also, update the function document to warn about the behavior at
error.
- simple_abst: null check for lib
- mixer: fixed double free

PCM API

- Remove unused hostname resolution in shm plugins and aserver
PCM and control shm plugins and aserver have some codes to resolve the
host address and check whether it's a local host although the given
address is never used. In addition, the code contains gethostbyname()
that is known to be obsoleted. So, let's get rid of all these unused
codes.
The host configuration item is still accepted (but just ignored) for
keeping the compatibility.
- pcm: fix buffer overflow in snd_pcm_chmap_print()
The size argument is wrong for one of the snprintf() calls in
snd_pcm_chmap_print(), allowing an overflow to happen (the user-provided
buffer may be written data up to 2x its actual size).
Seen in an user report here: http://trac.kodi.tv/ticket/15641
- pcm: Fix assorted tstamp_type bugs/omissions.
Just a couple of quick fixes related to tstamp_type.
- snd_pcm_sw_params(): copy tstamp_type field
- snd_pcm_tstamp_type_name(): fix argument type
- snd_pcm_dump_sw_setup(): fix dumping of tstamp_type field
- pcm: Fix DSD sample format endianess and add big-endian format
This patch adds big-endian DSD sample format and fixes return value of DSD
formats for snd_pcm_format_little_endian().
- pcm: dmix: Don't ignore SND_TIMER_EVENT_MSTOP
When a slave PCM gets an error like XRUN, it stops and notifies with
SND_TIMER_EVENT_MSTOP event. But the current code filters out this
type and eventually hang due to the empty timer queue. The fix is to
just add this event type to the filter bit mask.
- pcm: return negative value in case of error
- pcm_hooks: null check for h
- pcm_share: fixing missing mutex unlock
- pcm_file: fixed missing free
- pcm, rate: hw_avail must not be negative before starting the stream
If it is, then it means most likely the driver problem, so we should
return error immediately instead.
- pcm route: Fix the bad condition (always false)
- Revert "pcm: rewindable, forwardable: don't return stale data"
This reverts commit 6db0fe495ef1db1fd8f0ed791996f834665a926b.
- pcm, file: don't recurse in the rewindable and forwardable callbacks
- pcm: rewindable, forwardable: don't return stale data
The current behavior of snd_pcm_rewindable and snd_pcm_forwardable means
that the returned value is only accurate to one period. Or maybe even
meaningless if period interrupts are off. Fetch the up-to-date position
of the hardware pointer, as that's what is wanted by callers.
- dsnoop: rewindable and forwardable logic was swapped
- rate: handle negative values from snd_pcm_mmap_playback_hw_avail
Such negative returns are possible during an underrun if xrun detection
is disabled.
So, don't store the result in an unsigned variable (where it will
overflow), and postpone the trigger in such case, too.
- pcm, null: use the snd_pcm_mmap_avail function
instead of the open-coded equivalent
- pcm, rate: use the snd_pcm_mmap_hw_avail function
instead of the open-coded equivalent
- pcm: handle negative values from snd_pcm_mmap_hw_avail
Such negative values can happen when an underrun happens and xrun
detection is disabled. Another situation is if the device updated the
pointer before alsa-lib has a chance to detect the xrun.
The problem is that these negative values could propagate to the
snd_pcm_rewindable return value, where it is specified that negative
returns must be interpreted as error codes and not as negative amount of
samples.
- pcm: express the rewind size limitation logic better
There are a few places where the argument of the .rewind or .forward
callback is checked against the same value as returned by .rewindable or
.forwardable. Express this "don't rewind more than rewindable" logic
explicitly, so that the future fixes to the rewindable size can go to
one function instead of two.
While at it, take advantage of the fact that snd_pcm_mmap_avail() cannot
return negative values (except due to integer overflow, which is AFAICS
impossible given the current boundary choice).
- dmix: actually rewind when running or being drained
- pcm: add new 32-bit DSD sample format
Add the new DSD_U32_LE sample format to alsa-lib.
NB include/pcm.h and include/sound/asound.h are updated so a new sync with the
kernel headers is not needed
- pcm: fix return value of snd_pcm_share_slave_avail
The return value was wrong for playback if slave->hw_ptr was near the
boundary and *pcm->appl.ptr was near zero. The wrong result was greater
than the boundary.
- pcm: fix snd_pcm_mmap_hw_avail() near the boundary
This function returned incorrect results when hw.ptr was near the
boundary and hw.appl_ptr was near zero. Here "incorrect" means "greater
than the boundary".
The result was incorrect, because it was used as a return value of
various *_rewindable() functions and also as the delay for ioplug.
- pcm: 2nd round of pcm_misc DSD fixes
Functions 'snd_pcm_format_silence_64' and 'snd_pcm_format_size' also need to be
able to handle the DSD smaple format.
Changes from v1:
- Correct silence pattern for DSD
- pcm: Add missing signed and endianess definitions for DSD formats
- pcm: Fix DSD formats userland usability
Support for DSD sample formats has been added a while ago. This patch makes
those sample formats beter usable from userland (e.g. aplay).
[These implementation details have been forgotten in the previous DSD
support patch -- tiwai]
- pcm: pcm_local.h: include <time.h> to enable CLOCK_MONOTONIC
CLOCK_MONITONIC is defined in <bits/time.h>, add <time.h> before
<sys/time.h>.
- pcm: Drop snd_pcm_linear_{get|put}32_index()
These are identical with snd_pcm_linear_{get|put}_index().
- pcm: route: Use get32 for multi-source route calculation
The PCM route plugin can assign the destination value from average of
multiple sources with attenuation. This requires the read of each
channel value, sums and writes the resultant value in the requested
format.
Currently, get_labels is used for reading source values while
put32_labels is used for writing the dest value. This is, however,
a buggy implementation; get_labels gives the value as is only with
endianness and signedness conversions, but put32_labels assumes that
the value is normalized to 32bit int and it shifts down to the dest
format. In addition, the current code lacks get_labels entries for
the 24bit formats, as Shengjiu Wang spotted out.
For fixing these bugs, this patch replaces the read with
get32_labels and use always 64bit int for sum. This simplifies the
code a lot and drops many lines.
- pcm: Fill sw_params proto field
Fill the new proto field introduced to sw_params with the current PCM
protocol version. This makes tstamp_type evaluated properly in the
kernel.
- pcm: route: Use get/put labels for all 3 byte formats
So far, use_getput flag is set only when the src or dest format is
24bit physical width. But, also 18 and 20 bit physical width formats
should set the flag, too. This patch makes the check broader to cover
all 3 bytes formats.
- pcm: Implement timestamp type handling in all plugins
Now all PCM plugins do support the proper timestamp type or pass it
over slaves. The internal monotonic flag is dropped and replaced with
tstamp_type in all places.
- pcm: Implement timestamp type setup in hw plugin
This patch implements the support for sw_params timestamp type in PCM
hw layer. As gettimestamp() is still unchanged, the resultant
timstamps may be still with CLOCK_MONOTONIC even if you pass monotonic
raw type. More fixes will follow.
- pcm: Add sw_params API functions to get/set timestamp type
For obtaining / changing the timestamp type, add the corresponding
sw_params accessor API functions together with the public definitions
of timestamp types.
This patch only adds the functions and defines but doesn't bring the
functional changes yet.
- pcm: rate: fix hw_ptr exceed the boundary
For long time test case, the hw_ptr will exceed the boundary, then cause
the avail size wrong.

RawMidi API

- rawmidi: close handle h

Use Case Manager API

- ucm: fix some variable constness issues
I submitted earlier a patch that made the value parameter of
snd_use_case_get() non-const, but as that changed the public API, the
patch couldn't be accepted. This is the same patch, modifying the
internal code so that there are fewer issues with constness, but the
public API is left alone (a comment was added to the function
documentation, though, so that hopefully nobody else will try to fix
the same unfixable problem).
- ucm: fix the logic of choosing the default cdev
If the cdev has not been configured explicitly, use the PlaybackCTL
or CaptureCTL value if one of them is set. If neither are set, or if
both are set to different values, then there's no sensible default, so
executing the sequence should fail. The previous code probably tried
to implement this logic, but it was buggy.
Also use more descriptive variable names than "cdev1" and "cdev2".
- ucm: fix incorrect error code sign
Reported-by: Takashi Iwai <tiwai@suse.de>
- ucm: fix variable mixup
I assume the intention was to use cdev1 for PlaybackCTL and cdev2 for
CaptureCTL, but cdev1 was being used for both and cdev2 was not used
for anything.
- ucm: add binary configure file parse
with cset command, UCM set kcontrol parameters directly:
cset "name='<KCONTROL_NAME>' 1<,2,3,...>"
This patch enables UCM to set kcontrol with parameters from
configure file:
cset-bin-file "name='<KCONTROL_NAME>' <path/to/file>"
where "cset-bin-file" is a newly added keyword alongside of "cset",
to indicate cset with binary data in file.
The binary data in file is parameter for audio DSPs, and it's just
passed by UCM/ALSA as raw data. The data type of parameter elements
must be byte, and the count must matches driver definition.
- ucm: Fix uninitialized err in snd_use_case_set()
The compiler warns like:
main.c:1664:9: warning: 'err' may be used uninitialized in this function [-Wmaybe-uninitialized]
and actually there are slight code paths that slip.
This patch adds the proper initializations to 0 to return the success
code in these code paths.
- ucm: Document PlaybackPCMIsDummy and CapturePCMIsDummy values
At least PulseAudio needs special handling for dummy devices. To allow
that to happen automatically, the UCM configuration should contain the
information about which PCMs are dummy.

/include/Makefile.am

- autotools: fix ucm partial build
When --disable-ucm configure option is specified,
don't install related include file.

ALSA Server

- Remove unused hostname resolution in shm plugins and aserver
PCM and control shm plugins and aserver have some codes to resolve the
host address and check whether it's a local host although the given
address is never used. In addition, the code contains gethostbyname()
that is known to be obsoleted. So, let's get rid of all these unused
codes.
The host configuration item is still accepted (but just ignored) for
keeping the compatibility.

Configuration

- conf: add support for USB AudioSport Quattro (tm)
This patch resulted from discussion with redlion_ on #alsa IRC channel
on Freenode. 4-channel playback now works. 4-channel capture works too,
but not simultaneously with playback (hardware limitation).
Alsa-info before the fix:
http://www.alsa-project.org/db/?f=a3673622074b88a1abf4ccc6e7f37d0b5b72f34a
- conf/ucm: GoogleNyan: Add configuration
Taken from the ChromeOS sources, this configuration should apply to all
Nyan boards from Google, so far HP Chromebook 14 (nyan-blaze) and Acer
Chromebook 13 (nyan-big).
- USB-audio: Add five more cards to IEC958 blacklist
These devices do not have any IEC958 outputs, so prevent them from
being opened.
- USB-Audio: Add Scarlett 2i4 USB to S/PDIF blacklist
Like Scarlett 2i2, the 2i4 does not have any S/PDIF connections.
- conf/ucm: PAZ00: add Toshiba AC100/Dynabook AZ new config
Recent mainline kernels threat Toshiba AC100 audio hardware as hw:PAZ00
vs old hw:tegraalc5632.
This patch adds config files for new hw name and include them to
makefiles.
- conf: return negative value in case of error
- USB-Audio: Add second S/PDIF device on Phiree U2
Phiree U2 has an unusual configuration. It only has S/PDIF output, but
there are still two devices presented:
- device 0: PCM audio, subject to volume control
- device 1: non-PCM data (passthrough), not subject to volume control
It looks like the AES bits are set according to the selected device,
since outputting PCM data via device 1 will not work (silence).
Currently only the device 0 is shown via the "iec958" alias, and the
second device is not accessible via hinted aliases.
Simply provide access to both of these devices via the "iec958" alias.
Reported-by: touc @ XBMC forum
- ICE1712: add surround71 pcm definition
The M-Audio Delta 1010 card has 7.1 analog output, but no ready-made pcm
definition to use it.
Reported-and-tested-by: Matt Zagrabelny <mzagrabe@d.umn.edu>

Documentation

- doc: fix cross-compiling example
Simplest way to configure cross-compilation with configure
script is to pass '--host' option.
Passing just '--target' doesn't work.

Dynamic Loader helpers

- dlmisc: Remove unused label
Fix a compile warning
dlmisc.c:329:2: warning: label 'unlock' defined but not used [-Wunused-label]
- snd_dlsym: only do versioning checks if built --with-versioning
a combination of some of the following garbage collecting LD/CFLAGS
-Os -g0 -fdata-sections -ffunction-sections -s -Wl,--gc-sections
-fno-unwind-tables -fno-asynchronous-unwind-tables
causes the symbol versioning marker symbols to be removed from BSS
since they're otherwise unreferenced. this causes dlsym failing to
find them which results in runtime breakage:
$ alsamixer
ALSA lib dlmisc.c:142:(snd_dlsym_verify) unable to verify version for symbol snd_config_hook_load
ALSA lib conf.c:3328:(snd_config_hooks_call) symbol snd_config_hook_load is not defined inside (null)
ALSA lib conf.c:3788:(snd_config_update_r) hooks failed, removing configuration
cannot open mixer: No such device or address
correct DSO:
$ objdump -T libasound.so.2.strip | grep _snd_config_hook_load_dlsym_config_hook_001
001196bc g DO .bss 00000001 _snd_config_hook_load_dlsym_config_hook_001
incorrect DSO:
$ objdump -T libs/libasound.so.2 | grep _snd_config_hook_load_dlsym_config_hook_001
00000000 g DO *ABS* 00000001 _snd_config_hook_load_dlsym_config_hook_001
since alsa was built with --without-versioning, doing those versioning
checks at all is unnecessary and harmful and thus now disabled in this case.

Filename helpers

- snd_user_file: fix memory leak
Call wordfree if and only if wordfree returns zero or WRDE_NOSPACE

Kernel Headers

- hwdep: add OXFW driver support
Linux 3.19 newly support this driver. By hardware dependent interface,
userspace applications can get hardware information, lock/unlock kernel
streaming and receive lock status event.
- pcm: Fix DSD sample format endianess and add big-endian format
This patch adds big-endian DSD sample format and fixes return value of DSD
formats for snd_pcm_format_little_endian().
- pcm: add new 32-bit DSD sample format
Add the new DSD_U32_LE sample format to alsa-lib.
NB include/pcm.h and include/sound/asound.h are updated so a new sync with the
kernel headers is not needed
- Sync include/sound/asound.h with 3.17-rc1 kernel
- pcm: Fix DSD formats userland usability
Support for DSD sample formats has been added a while ago. This patch makes
those sample formats beter usable from userland (e.g. aplay).
[These implementation details have been forgotten in the previous DSD
support patch -- tiwai]
- pcm: Fill sw_params proto field
Fill the new proto field introduced to sw_params with the current PCM
protocol version. This makes tstamp_type evaluated properly in the
kernel.
- Add timestamp type to sw_params (internal only)
This patch is just the udpate of sound/asound.h taken from the kernel
commit. The API changes and PCM structure changes will follow after
this.
- pcm: Provide a CLOCK_MONOTONIC_RAW timestamp type
For applications which need to synchronise with external timebases such
as broadcast TV applications the kernel monotonic time is not optimal as
it includes adjustments from NTP and so may still include discontinuities
due to that. A raw monotonic time which does not include any adjustments
is available in the kernel from getrawmonotonic() so provide userspace with
a new timestamp type SNDRV_PCM_TSTAMP_TYPE_MONOTONIC_RAW which provides
timestamps based on this as an option.
Reported-by: Daniel Thompson <daniel.thompson@linaro.org>

Simple Abstraction Mixer Modules

- sbase: fixed missing free

Socket helpers

- Remove unused hostname resolution in shm plugins and aserver
PCM and control shm plugins and aserver have some codes to resolve the
host address and check whether it's a local host although the given
address is never used. In addition, the code contains gethostbyname()
that is known to be obsoleted. So, let's get rid of all these unused
codes.
The host configuration item is still accepted (but just ignored) for
keeping the compatibility.
- socket: missing socket close

Test/Example code

- test/audio_time: Set timestamp type explicitly

alsa-utils

Core

- Release v1.0.29
- configure: allow contitional compilation of alsaucm
If alsa-lib have been compiled with --disable-ucm, alsaucm can't be built.
Detection is dynamic, no configure command line option is available for now.
- Add missing alsa-info entry to the root Makefile.am
- Add alsa-info.sh to alsa-utils repo
Copied the latest version (0.4.63) from alsa-driver repo.

ALSA Control (alsactl)

- alsactl/init: Add "Line Out" to list of outputs to initialize
- alsactl/init: Change the "basic rules" description
We now enable more outputs than just the main speaker, so update
the basic rules to reflect the actual situation.
- alsactl: add missing state_unlock() call
- alsactl: coverity - missing_va_end – va_end was not called for "ap"
- monitor: fix clang warning - Declared variable-length array (VLA) has zero size
- alsactl: aded missing monitor() prototype
- alsactl: Fix the file locking routines (for the state management)
- alsactl: save state - do not call rename for stdio

Speaker Test

- speaker-text: fix simple signess assignment warning
- speaker-test: Add missing draining at the end
Without the call of snd_pcm_drain() the pending data on the buffer
might be discarded, which results in the abort of playback sound in
the middle. Let's fix it.
Reported-and-tested-by: Jarkko Nikula <jarkko.nikula@linux.intel.com>

alsa-info.sh

- alsa-info.sh: add script to EXTRA_DIST (automake)
- alsa-info: Refactor "withall" logic
Previously, using --output, --no-upload, --upload and --pastebin
switches implied the withall switch.
A more intuitive logic would be that --with-all is disabled if you
use another --with* switch, such as --withdmesg, and only then.
Also update script version to reflect the behaviour change.
- alsa-info: Make sure all full script is run even with "output" option
For some reason, when the --output option is used, less information
is included compared to when no options are used. This is unexpected.
Fix this by running "withall" also when the output option is used.
- Add alsa-info.sh to alsa-utils repo
Copied the latest version (0.4.63) from alsa-driver repo.

alsamixer

- alsamixer: include missing mixer_controls.h

amixer

- amixer: Parse the value more strictly
So far amixer allows some unexpected suffix and assumes as a raw
absolute value without returning an error. This is rather dangerous,
e.g. user might not notice that a completely wrong value was set when
the command line included a typo.
This patch makes the parser a bit more strict: it doesn't allow any
longer invalid suffixes, instead either returns an error or skips the
invalid value, depending on the operation mode.
- amixer: Make "dB" case-insensitive in set commands
We don't have to be necessarily too strict about case-sensitivity of
"dB" suffix used in set commands.

aplay/arecord

- Revert "aplay: fix pcm_read() return value"
This reverts commit 8aa13eec80eac312e4b99423909387660fb99b8f.
The semantics for pcm_read() and pcm_readv() was changed, but the
callers expect the exact frame count as requested. It's possible
to fix callers, but the fix is more complicated than to revert the
change. Note that '-d' processing was broken in some cases.
Note: The reverted commit allows that the return value might be
greater than requested (see the first condition in read routines).

alsa-tools

Core

- Release v1.0.29
- Add a small "hdajacksensetest" helper
I previously had a small python script doing the same thing,
but it depended on hda-analyzer, which always breaks when something
new is added to the codec proc file.
I got tired and rewrote it as a small C program instead, which I
hope will be a useful addition to alsa-tools.

HDA Jack Retask

- hdajackretask: Add dock hp/mic/line to simple options
This allows for simpler setting of dock headphone, dock mic,
dock line out and dock line in.
Also improve detection a bit so that an existing dock headphone
shows up as such and not as regular headphone.
- hdajackretask: Add "hints" functionality
The kernel driver has some hints you can send to it that changes
parser behaviour. This patch exposes that functionality to the user.
(This patch also includes minor fixes for documentation, GTK warnings
and whitespace.)

HDA Jack Sense Test

- Add a small "hdajacksensetest" helper
I previously had a small python script doing the same thing,
but it depended on hda-analyzer, which always breaks when something
new is added to the codec proc file.
I got tired and rewrote it as a small C program instead, which I
hope will be a useful addition to alsa-tools.

ld10k1 (EMU10K1+ DSP Code Loader)

- ld10k1: Fix missing parentheses for functions
The commit a1728250 removes bash-specific "function" but the necessary
parentheses are missing.

alsa-firmware

Core

- Release v1.0.29

AudioScience ASIHPI Firmware

- asihpi: remove removed dsp2400.bin from Makefile.am
- asihpi: Update firmware to version 4.14
Also remove the superfluous file (dsp2400.bin) which was added
mistakenly.

alsa-plugins

Core

- Release v1.0.29

A52 Output plugin

- a52: Ignore start request if we're already running
When trying to start a PCM that's already running, the result is EBADFD.
We might have implicitly started the buffer by filling it up,
so just ignore this request if we're already running.
Reported-by: Chow Loong Jin <hyperair@ubuntu.com>

Jack PCM plugin

- jack: Restore PID to jack client name when not specified explicitly
Commit 14190cd8 added a facility to explicitly name Jack clients with
a 'name' option, but did so in a way that was not fully
backwards-compatible with older versions of the alsa-plugins. There
were two issues:
1. Re-using the magical "name" variable, which comes preloaded with
the name of the PCM
2. The code assumed snd_config_get_string sets a variable to NULL if
the config entry does not exist. Instead, this function leaves the
variable unchanged.
The result of these two errors meant that the PCM name would be
treated as if it were a user-defined name, and the old code which
embedded the PID would never be run
This code uses a completely new variable to store the explicitly-set
client name, so that the two code paths no longer collide.
[fixed trivial coding style issues by tiwai]
Custom Search
Personal tools
Namespaces

Variants
Actions
Navigation
wiki
Toolbox