Using the Wii U GamePad in your application
libdrc provides a class called drc::Streamer in the drc/streamer.h
header file. drc::Streamer objects expose 5 major functions:
- streamer->Start() starts streaming data to the Wii U GamePad.
- streamer->Stop() stops the streamer object.
- streamer->PushVidFrame(&pixels, width, height, pixel_format) pushes a
video frame to the Wii U GamePad. pixels should be a vector of
width * height pixels represented in the given pixel format.
- streamer->PushAudSamples(samples) pushes audio samples to the Wii U
GamePad. The API currently expects sound data sampled at 48KHz with two
interlaced channels (samples[0] is for the left audio channel,
samples[1] is for the right audio channel, ...).
- streamer->PollInput(&input) gets the most recent input data received from
the GamePad.
Adding basic support for the Wii U GamePad in an already existing application
is a relatively easy task:
- Create a drc::Streamer global object/singleton and Start() it when
starting the program, before the first frame is rendered.
- To handle input from the GamePad, two possibilities are offered to library
users. The easiest solution is to use the SystemInputFeeder utility to
send GamePad data to the operating system (on Linux, via the uinput API).
This should allow the application to make use of the GamePad in a transparent
way if it already has support for other game input devices. To enable this
utility, use the EnableSystemInputFeeder method of the streamer object.
The second, harder way is to write specific input handling code for the
GamePad using the PollInput method. This is the only way to get access to
some features of the GamePad like the touchscreen or the battery status
informations.
- To stream video, the application needs to provide the raw image pixels to be
streamed to libdrc. For that, OpenGL software can use glReadPixels (slow)
or Pixel Buffer Objects (PBOs) in order to fetch the GPU rendering buffer.
Then, this image can be sent to libdrc via the PushVidFrame streamer
function.
- To stream audio, the application needs to provide the raw audio samples to
libdrc. Audio mixing is usually being done in software, refer to the specific
audio API documentation to learn how to read the raw audio samples before
they are sent to the operating system. These samples can then be pushed to
libdrc via the PushAudSamples function.