2 * Copyright 2008, Google Inc.
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions are
9 * * Redistributions of source code must retain the above copyright
10 * notice, this list of conditions and the following disclaimer.
11 * * Redistributions in binary form must reproduce the above
12 * copyright notice, this list of conditions and the following disclaimer
13 * in the documentation and/or other materials provided with the
15 * * Neither the name of Google Inc. nor the names of its
16 * contributors may be used to endorse or promote products derived from
17 * this software without specific prior written permission.
19 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
20 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
21 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
22 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
23 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
24 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
25 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
26 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
27 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
28 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
29 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
34 * NaCl low-level runtime library interfaces.
36 * Note: audio/video function declarations have moved to
37 * native_client/tools/libav
39 * Applications should #include <nacl/nacl_av.h> instead of this file.
43 #ifndef NATIVE_CLIENT_SERVICE_RUNTIME_AUDIO_VIDEO_H_
44 #define NATIVE_CLIENT_SERVICE_RUNTIME_AUDIO_VIDEO_H_
48 * Defines a basic audio/video interface for Native Client applications.
50 * @addtogroup audio_video
58 #define kNaClAudioBufferLength (16 * 1024)
62 * Subsystem enumerations for nacl_multimedia_init()
63 * These values can be used as a bitset.
64 * To initialize multiple subsystems, use the | operator to
65 * combine them, for example:
66 * NACL_SUBSYSTEM_VIDEO | NACL_SUBSYSTEM_AUDIO
69 NACL_SUBSYSTEM_VIDEO
= 0x01, /**< application will output video */
70 NACL_SUBSYSTEM_AUDIO
= 0x02, /**< application will emit audio */
71 NACL_SUBSYSTEM_EMBED
= 0x04 /**< application will embed in browser */
76 * Audio format enumerations for nacl_audio_init()
77 * Describes the source data format that will be used to drive
80 enum NaClAudioFormat
{
81 NACL_AUDIO_FORMAT_STEREO_44K
= 0, /**< 44.1kHz 16 bit stereo */
82 NACL_AUDIO_FORMAT_STEREO_48K
/**< 48kHz 16 bit stereo */
87 * Event type enumerations used to identify event structure.
90 NACL_EVENT_NOT_USED
= 0,
91 NACL_EVENT_ACTIVE
, /**< triggered when focus gained / lost */
92 NACL_EVENT_EXPOSE
, /**< external source requests redraw */
93 NACL_EVENT_KEY_DOWN
, /**< key down (pressed) */
94 NACL_EVENT_KEY_UP
, /**< key up (released) */
95 NACL_EVENT_MOUSE_MOTION
, /**< mouse movement */
96 NACL_EVENT_MOUSE_BUTTON_DOWN
, /**< mouse button down (pressed) */
97 NACL_EVENT_MOUSE_BUTTON_UP
, /**< mouse button up (released) */
98 NACL_EVENT_QUIT
, /**< application quit */
99 NACL_EVENT_UNSUPPORTED
105 * Do not alter these mappings; they must match SDL.
108 NACL_KEY_UNKNOWN
= 0,
110 NACL_KEY_BACKSPACE
= 8,
113 NACL_KEY_RETURN
= 13,
115 NACL_KEY_ESCAPE
= 27,
117 NACL_KEY_EXCLAIM
= 33,
118 NACL_KEY_QUOTEDBL
= 34,
120 NACL_KEY_DOLLAR
= 36,
121 NACL_KEY_AMPERSAND
= 38,
123 NACL_KEY_LEFTPAREN
= 40,
124 NACL_KEY_RIGHTPAREN
= 41,
125 NACL_KEY_ASTERISK
= 42,
129 NACL_KEY_PERIOD
= 46,
142 NACL_KEY_SEMICOLON
= 59,
144 NACL_KEY_EQUALS
= 61,
145 NACL_KEY_GREATER
= 62,
146 NACL_KEY_QUESTION
= 63,
148 NACL_KEY_LEFTBRACKET
= 91,
149 NACL_KEY_BACKSLASH
= 92,
150 NACL_KEY_RIGHTBRACKET
= 93,
152 NACL_KEY_UNDERSCORE
= 95,
153 NACL_KEY_BACKQUOTE
= 96,
180 NACL_KEY_DELETE
= 127,
181 NACL_KEY_WORLD_0
= 160,
182 NACL_KEY_WORLD_1
= 161,
183 NACL_KEY_WORLD_2
= 162,
184 NACL_KEY_WORLD_3
= 163,
185 NACL_KEY_WORLD_4
= 164,
186 NACL_KEY_WORLD_5
= 165,
187 NACL_KEY_WORLD_6
= 166,
188 NACL_KEY_WORLD_7
= 167,
189 NACL_KEY_WORLD_8
= 168,
190 NACL_KEY_WORLD_9
= 169,
191 NACL_KEY_WORLD_10
= 170,
192 NACL_KEY_WORLD_11
= 171,
193 NACL_KEY_WORLD_12
= 172,
194 NACL_KEY_WORLD_13
= 173,
195 NACL_KEY_WORLD_14
= 174,
196 NACL_KEY_WORLD_15
= 175,
197 NACL_KEY_WORLD_16
= 176,
198 NACL_KEY_WORLD_17
= 177,
199 NACL_KEY_WORLD_18
= 178,
200 NACL_KEY_WORLD_19
= 179,
201 NACL_KEY_WORLD_20
= 180,
202 NACL_KEY_WORLD_21
= 181,
203 NACL_KEY_WORLD_22
= 182,
204 NACL_KEY_WORLD_23
= 183,
205 NACL_KEY_WORLD_24
= 184,
206 NACL_KEY_WORLD_25
= 185,
207 NACL_KEY_WORLD_26
= 186,
208 NACL_KEY_WORLD_27
= 187,
209 NACL_KEY_WORLD_28
= 188,
210 NACL_KEY_WORLD_29
= 189,
211 NACL_KEY_WORLD_30
= 190,
212 NACL_KEY_WORLD_31
= 191,
213 NACL_KEY_WORLD_32
= 192,
214 NACL_KEY_WORLD_33
= 193,
215 NACL_KEY_WORLD_34
= 194,
216 NACL_KEY_WORLD_35
= 195,
217 NACL_KEY_WORLD_36
= 196,
218 NACL_KEY_WORLD_37
= 197,
219 NACL_KEY_WORLD_38
= 198,
220 NACL_KEY_WORLD_39
= 199,
221 NACL_KEY_WORLD_40
= 200,
222 NACL_KEY_WORLD_41
= 201,
223 NACL_KEY_WORLD_42
= 202,
224 NACL_KEY_WORLD_43
= 203,
225 NACL_KEY_WORLD_44
= 204,
226 NACL_KEY_WORLD_45
= 205,
227 NACL_KEY_WORLD_46
= 206,
228 NACL_KEY_WORLD_47
= 207,
229 NACL_KEY_WORLD_48
= 208,
230 NACL_KEY_WORLD_49
= 209,
231 NACL_KEY_WORLD_50
= 210,
232 NACL_KEY_WORLD_51
= 211,
233 NACL_KEY_WORLD_52
= 212,
234 NACL_KEY_WORLD_53
= 213,
235 NACL_KEY_WORLD_54
= 214,
236 NACL_KEY_WORLD_55
= 215,
237 NACL_KEY_WORLD_56
= 216,
238 NACL_KEY_WORLD_57
= 217,
239 NACL_KEY_WORLD_58
= 218,
240 NACL_KEY_WORLD_59
= 219,
241 NACL_KEY_WORLD_60
= 220,
242 NACL_KEY_WORLD_61
= 221,
243 NACL_KEY_WORLD_62
= 222,
244 NACL_KEY_WORLD_63
= 223,
245 NACL_KEY_WORLD_64
= 224,
246 NACL_KEY_WORLD_65
= 225,
247 NACL_KEY_WORLD_66
= 226,
248 NACL_KEY_WORLD_67
= 227,
249 NACL_KEY_WORLD_68
= 228,
250 NACL_KEY_WORLD_69
= 229,
251 NACL_KEY_WORLD_70
= 230,
252 NACL_KEY_WORLD_71
= 231,
253 NACL_KEY_WORLD_72
= 232,
254 NACL_KEY_WORLD_73
= 233,
255 NACL_KEY_WORLD_74
= 234,
256 NACL_KEY_WORLD_75
= 235,
257 NACL_KEY_WORLD_76
= 236,
258 NACL_KEY_WORLD_77
= 237,
259 NACL_KEY_WORLD_78
= 238,
260 NACL_KEY_WORLD_79
= 239,
261 NACL_KEY_WORLD_80
= 240,
262 NACL_KEY_WORLD_81
= 241,
263 NACL_KEY_WORLD_82
= 242,
264 NACL_KEY_WORLD_83
= 243,
265 NACL_KEY_WORLD_84
= 244,
266 NACL_KEY_WORLD_85
= 245,
267 NACL_KEY_WORLD_86
= 246,
268 NACL_KEY_WORLD_87
= 247,
269 NACL_KEY_WORLD_88
= 248,
270 NACL_KEY_WORLD_89
= 249,
271 NACL_KEY_WORLD_90
= 250,
272 NACL_KEY_WORLD_91
= 251,
273 NACL_KEY_WORLD_92
= 252,
274 NACL_KEY_WORLD_93
= 253,
275 NACL_KEY_WORLD_94
= 254,
276 NACL_KEY_WORLD_95
= 255,
289 NACL_KEY_KP_PERIOD
= 266,
290 NACL_KEY_KP_DIVIDE
= 267,
291 NACL_KEY_KP_MULTIPLY
= 268,
292 NACL_KEY_KP_MINUS
= 269,
293 NACL_KEY_KP_PLUS
= 270,
294 NACL_KEY_KP_ENTER
= 271,
295 NACL_KEY_KP_EQUALS
= 272,
297 /* arrow & insert/delete pad */
300 NACL_KEY_RIGHT
= 275,
302 NACL_KEY_INSERT
= 277,
305 NACL_KEY_PAGEUP
= 280,
306 NACL_KEY_PAGEDOWN
= 281,
326 NACL_KEY_NUMLOCK
= 300,
327 NACL_KEY_CAPSLOCK
= 301,
328 NACL_KEY_SCROLLOCK
= 302,
329 NACL_KEY_RSHIFT
= 303,
330 NACL_KEY_LSHIFT
= 304,
331 NACL_KEY_RCTRL
= 305,
332 NACL_KEY_LCTRL
= 306,
335 NACL_KEY_RMETA
= 309,
336 NACL_KEY_LMETA
= 310,
337 NACL_KEY_LSUPER
= 311,
338 NACL_KEY_RSUPER
= 312,
340 NACL_KEY_COMPOSE
= 314,
344 NACL_KEY_PRINT
= 316,
345 NACL_KEY_SYSREQ
= 317,
346 NACL_KEY_BREAK
= 318,
348 NACL_KEY_POWER
= 320,
352 /* Add any other keys here */
358 * Key modifier enumerations
359 * These values can be used as a bitset.
360 * Do not alter these mappings; they must match SDL.
363 /* mods represented as bitset */
364 NACL_KEYMOD_NONE
= 0x0000,
365 NACL_KEYMOD_LSHIFT
= 0x0001,
366 NACL_KEYMOD_RSHIFT
= 0x0002,
367 NACL_KEYMOD_LCTRL
= 0x0040,
368 NACL_KEYMOD_RCTRL
= 0x0080,
369 NACL_KEYMOD_LALT
= 0x0100,
370 NACL_KEYMOD_RALT
= 0x0200,
371 NACL_KEYMOD_LMETA
= 0x0400,
372 NACL_KEYMOD_RMETA
= 0x0800,
373 NACL_KEYMOD_NUM
= 0x1000,
374 NACL_KEYMOD_CAPS
= 0x2000,
375 NACL_KEYMOD_MODE
= 0x4000,
376 NACL_KEYMOD_RESERVED
= 0x8000
381 * Mouse Buttons. Do not alter these mappings; they must match SDL.
383 enum NaClMouseButton
{
384 NACL_MOUSE_BUTTON_LEFT
= 1,
385 NACL_MOUSE_BUTTON_MIDDLE
= 2,
386 NACL_MOUSE_BUTTON_RIGHT
= 3,
387 NACL_MOUSE_SCROLL_UP
= 4,
388 NACL_MOUSE_SCROLL_DOWN
= 5
394 * These values can be used as bitsets. Do not alter these mappings; they
397 enum NaClMouseState
{
398 NACL_MOUSE_STATE_LEFT_BUTTON_PRESSED
= 1,
399 NACL_MOUSE_STATE_MIDDLE_BUTTON_PRESSED
= 2,
400 NACL_MOUSE_STATE_RIGHT_BUTTON_PRESSED
= 4
405 * Gain enumerations for NaClMultimediaActiveEvent
406 * These values can be used as a bitset. Do not alter these mappings; they
410 NACL_ACTIVE_MOUSE
= 1, /**< mouse leaving/entering */
411 NACL_ACTIVE_INPUT_FOCUS
= 2, /**< input focus lost/restored */
412 NACL_ACTIVE_APPLICATION
= 4 /**< application minimized/restored */
417 * Key symbol structure
419 struct NaClMultimediaKeySymbol
{
420 uint8_t scancode
; /**< H/W scancode */
421 int16_t sym
; /**< NaClKey symbol */
422 int16_t mod
; /**< NaClKeyMod key modifier */
428 * Active event. Generated when mouse cursor exits/enters window,
429 * input focus is lost/gained, and application is minimized/restored.
431 struct NaClMultimediaActiveEvent
{
432 uint8_t type
; /**< NACL_EVENT_ACTIVE */
433 uint8_t gain
; /**< NaClActive gain */
434 uint8_t state
; /**< state 0 - lost, minimized, leaving
435 1 - acquired, restored, entering */
440 * Expose event. Generated when the windowing system requests
441 * an application redraw/repaint update. Upon receiving this
442 * event, an application should call nacl_video_update()
444 struct NaClMultimediaExposeEvent
{
445 uint8_t type
; /**< NACL_EVENT_EXPOSE */
450 * Keyboard event. For both key down and key up events.
452 struct NaClMultimediaKeyboardEvent
{
453 uint8_t type
; /**< NACL_EVENT_KEY_UP or NACL_EVENT_KEY_DOWN */
454 uint8_t which
; /**< which keyboard (0 for primary) */
455 uint8_t state
; /**< indicates pressed (1) or released (0) */
456 struct NaClMultimediaKeySymbol keysym
; /**< key info */
461 * Mouse motion event. Generated when mouse moved by user and
462 * application is in focus.
464 struct NaClMultimediaMouseMotionEvent
{
465 uint8_t type
; /**< NACL_EVENT_MOUSE_MOTION */
466 uint8_t which
; /**< which mouse (0 for primary) */
467 uint8_t state
; /**< NaClMouseState button state bitset */
468 uint16_t x
; /**< x position */
469 uint16_t y
; /**< y position */
470 int16_t xrel
; /**< relative x position */
471 int16_t yrel
; /**< relative y position */
476 * Mouse button event. Generated when user presses or releases
477 * a mouse button, including the scroll wheel.
479 struct NaClMultimediaMouseButtonEvent
{
480 uint8_t type
; /**< NACL_EVENT_MOUSE_BUTTON_UP or
481 NACL_EVENT_MOUSE_BUTTON_DOWN */
482 uint8_t which
; /**< which mouse (0 for primary) */
483 uint8_t button
; /**< NaClMouseButton which button */
484 uint8_t state
; /**< indicates pressed (1) or released (0) */
485 uint16_t x
; /**< x position */
486 uint16_t y
; /**< y position */
491 * Quit event. The application should quit when receiving this event.
492 * This includes shutting down the video subsystem with nacl_video_shutdown()
493 * and other active subsystems (audio) followed by shutting down the
494 * multimedia library with nacl_multimedia_shutdown().
496 struct NaClMultimediaQuitEvent
{
497 uint8_t type
; /**< NACL_EVENT_QUIT */
502 * Pad event. Not used, but defines the largest size the event union
503 * should ever be. Events added in the future should never be larger than
504 * this structure. 64 byte events should be enough for all sane events.
506 * *** Do not ever change the size of this structure. ***
507 * Doing so will break other existing native client applications
509 struct NaClMultimediaPadEvent
{
515 * The event wrapper. Use type field to select which structure to process.
516 * At all times, sizeof NaClMultimediaEvent must match sizeof
517 * NaClMultimediaPadEvent.
519 union NaClMultimediaEvent
{
520 uint8_t type
; /**< one of NaClEvent */
521 struct NaClMultimediaActiveEvent active
;
522 struct NaClMultimediaExposeEvent expose
;
523 struct NaClMultimediaKeyboardEvent key
;
524 struct NaClMultimediaMouseMotionEvent motion
;
525 struct NaClMultimediaMouseButtonEvent button
;
526 struct NaClMultimediaQuitEvent quit
;
527 struct NaClMultimediaPadEvent pad
;
537 * End of Audio/Video group
540 #endif /* NATIVE_CLIENT_SERVICE_RUNTIME_AUDIO_VIDEO_H_ */