Digital steganography is often used with images and sounds simply because
these file formats make it easy to identify the areas of variability
in a purely structural way. This might be as simple as knowing that
every 24th bit in the file (after some initial offset) is a lowest
order red bit. Other file formats can be used, but often require
more semantic consideration of the file contents. Let us look at a
few examples.
Source code. Programming languages have fairly strict
structural constraints. That is the point of grammar, after all.
Even within grammatical constraints, most changes to a source code
file will result in programs that do not compile or run (for example, you
might be able to change a character in a variable name in a
subtextual way, but doing so will most likely break the program
logic in some manner). Even so, there are a number of areas of
non-predictable variation even in source code files; the trick is
that encoding them involves "understanding" the code in a richer way
than changing recurrent bit positions. Many programming languages
offer several equivalent constructs for the same operation: for
example, both "!=" and "<>" to express inequality. Or at a
higher level, you might even automate transformations between
different (equivalent) loop structures (for example,
for(;;){...} and while(1){...}). The
pattern of choices between constructs could contain one bit of
subchannel for each loop occurrence. Still, the best place to hide
a subchannel in source code is likely to be in the comment fields
-- but with some subtlety to make it look like actual source code
comments (you do comment source code, right?).