Some genious mind provided me with a surround sound system for my laptop. I just got it working, and my housemates will hate me for quite some time now. For some unknown reason, I know have six speakers in my three-by-two meter room, and they make enough noise to keep the whole house with me. Lovely!
Interestingly, we also pretty much figured out how we want this to be done in GStreamer. My previous proposal was not ideal enough, so we adapted it slightly. It now is somewhat more extensible than the previous proposal.
Basically, for a GstCaps/GstStructure with X channels, the structure will have an extra property "channel_positions" (if absent on channels <= 2, it's simply mono or stereo), which is a GValueArray filled with an enum of type GstChannelPosition. This will proove to be a truely adventurous task, because we haven't used named enums before. Particularly, serialization/deserialization (going to enum from string and back, for things like GConf or gst-launch commandline and so on) will proove to be interesting. Secondly, we will need type-specific (extendible) fixation functions (to make sure that it fixates to something sane (which somewhat resembles "surround", rather than "all channels topleft".
The enum will be similar to Microsoft's enumeration of channel positions, as specified here.
Time to proove myself worthy to this genious mind! I'd better have some interesting 5:1 DVDs with me for the next few weeks! :).