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_
46 #ifdef __native_client__
48 # include <machine/_default_types.h>
50 # include "native_client/include/portability.h"
55 * Defines a basic audio/video interface for Native Client applications.
57 * @addtogroup audio_video
65 #define kNaClAudioBufferLength (16 * 1024)
66 #define kNaClVideoMinWindowSize (32)
67 #define kNaClVideoMaxWindowSize (4096)
71 * Subsystem enumerations for nacl_multimedia_init()
72 * These values can be used as a bitset.
73 * To initialize multiple subsystems, use the | operator to
74 * combine them, for example:
75 * NACL_SUBSYSTEM_VIDEO | NACL_SUBSYSTEM_AUDIO
78 NACL_SUBSYSTEM_VIDEO
= 0x01, /**< application will output video */
79 NACL_SUBSYSTEM_AUDIO
= 0x02, /**< application will emit audio */
80 NACL_SUBSYSTEM_EMBED
= 0x04 /**< application will embed in browser */
85 * Audio format enumerations for nacl_audio_init()
86 * Describes the source data format that will be used to drive
89 enum NaClAudioFormat
{
90 NACL_AUDIO_FORMAT_STEREO_44K
= 0, /**< 44.1kHz 16 bit stereo */
91 NACL_AUDIO_FORMAT_STEREO_48K
/**< 48kHz 16 bit stereo */
96 * Event type enumerations used to identify event structure.
99 NACL_EVENT_NOT_USED
= 0,
100 NACL_EVENT_ACTIVE
, /**< triggered when focus gained / lost */
101 NACL_EVENT_EXPOSE
, /**< external source requests redraw */
102 NACL_EVENT_KEY_DOWN
, /**< key down (pressed) */
103 NACL_EVENT_KEY_UP
, /**< key up (released) */
104 NACL_EVENT_MOUSE_MOTION
, /**< mouse movement */
105 NACL_EVENT_MOUSE_BUTTON_DOWN
, /**< mouse button down (pressed) */
106 NACL_EVENT_MOUSE_BUTTON_UP
, /**< mouse button up (released) */
107 NACL_EVENT_QUIT
, /**< application quit */
108 NACL_EVENT_UNSUPPORTED
114 * Do not alter these mappings; they must match SDL.
117 NACL_KEY_UNKNOWN
= 0,
119 NACL_KEY_BACKSPACE
= 8,
122 NACL_KEY_RETURN
= 13,
124 NACL_KEY_ESCAPE
= 27,
126 NACL_KEY_EXCLAIM
= 33,
127 NACL_KEY_QUOTEDBL
= 34,
129 NACL_KEY_DOLLAR
= 36,
130 NACL_KEY_AMPERSAND
= 38,
132 NACL_KEY_LEFTPAREN
= 40,
133 NACL_KEY_RIGHTPAREN
= 41,
134 NACL_KEY_ASTERISK
= 42,
138 NACL_KEY_PERIOD
= 46,
151 NACL_KEY_SEMICOLON
= 59,
153 NACL_KEY_EQUALS
= 61,
154 NACL_KEY_GREATER
= 62,
155 NACL_KEY_QUESTION
= 63,
157 NACL_KEY_LEFTBRACKET
= 91,
158 NACL_KEY_BACKSLASH
= 92,
159 NACL_KEY_RIGHTBRACKET
= 93,
161 NACL_KEY_UNDERSCORE
= 95,
162 NACL_KEY_BACKQUOTE
= 96,
189 NACL_KEY_DELETE
= 127,
190 NACL_KEY_WORLD_0
= 160,
191 NACL_KEY_WORLD_1
= 161,
192 NACL_KEY_WORLD_2
= 162,
193 NACL_KEY_WORLD_3
= 163,
194 NACL_KEY_WORLD_4
= 164,
195 NACL_KEY_WORLD_5
= 165,
196 NACL_KEY_WORLD_6
= 166,
197 NACL_KEY_WORLD_7
= 167,
198 NACL_KEY_WORLD_8
= 168,
199 NACL_KEY_WORLD_9
= 169,
200 NACL_KEY_WORLD_10
= 170,
201 NACL_KEY_WORLD_11
= 171,
202 NACL_KEY_WORLD_12
= 172,
203 NACL_KEY_WORLD_13
= 173,
204 NACL_KEY_WORLD_14
= 174,
205 NACL_KEY_WORLD_15
= 175,
206 NACL_KEY_WORLD_16
= 176,
207 NACL_KEY_WORLD_17
= 177,
208 NACL_KEY_WORLD_18
= 178,
209 NACL_KEY_WORLD_19
= 179,
210 NACL_KEY_WORLD_20
= 180,
211 NACL_KEY_WORLD_21
= 181,
212 NACL_KEY_WORLD_22
= 182,
213 NACL_KEY_WORLD_23
= 183,
214 NACL_KEY_WORLD_24
= 184,
215 NACL_KEY_WORLD_25
= 185,
216 NACL_KEY_WORLD_26
= 186,
217 NACL_KEY_WORLD_27
= 187,
218 NACL_KEY_WORLD_28
= 188,
219 NACL_KEY_WORLD_29
= 189,
220 NACL_KEY_WORLD_30
= 190,
221 NACL_KEY_WORLD_31
= 191,
222 NACL_KEY_WORLD_32
= 192,
223 NACL_KEY_WORLD_33
= 193,
224 NACL_KEY_WORLD_34
= 194,
225 NACL_KEY_WORLD_35
= 195,
226 NACL_KEY_WORLD_36
= 196,
227 NACL_KEY_WORLD_37
= 197,
228 NACL_KEY_WORLD_38
= 198,
229 NACL_KEY_WORLD_39
= 199,
230 NACL_KEY_WORLD_40
= 200,
231 NACL_KEY_WORLD_41
= 201,
232 NACL_KEY_WORLD_42
= 202,
233 NACL_KEY_WORLD_43
= 203,
234 NACL_KEY_WORLD_44
= 204,
235 NACL_KEY_WORLD_45
= 205,
236 NACL_KEY_WORLD_46
= 206,
237 NACL_KEY_WORLD_47
= 207,
238 NACL_KEY_WORLD_48
= 208,
239 NACL_KEY_WORLD_49
= 209,
240 NACL_KEY_WORLD_50
= 210,
241 NACL_KEY_WORLD_51
= 211,
242 NACL_KEY_WORLD_52
= 212,
243 NACL_KEY_WORLD_53
= 213,
244 NACL_KEY_WORLD_54
= 214,
245 NACL_KEY_WORLD_55
= 215,
246 NACL_KEY_WORLD_56
= 216,
247 NACL_KEY_WORLD_57
= 217,
248 NACL_KEY_WORLD_58
= 218,
249 NACL_KEY_WORLD_59
= 219,
250 NACL_KEY_WORLD_60
= 220,
251 NACL_KEY_WORLD_61
= 221,
252 NACL_KEY_WORLD_62
= 222,
253 NACL_KEY_WORLD_63
= 223,
254 NACL_KEY_WORLD_64
= 224,
255 NACL_KEY_WORLD_65
= 225,
256 NACL_KEY_WORLD_66
= 226,
257 NACL_KEY_WORLD_67
= 227,
258 NACL_KEY_WORLD_68
= 228,
259 NACL_KEY_WORLD_69
= 229,
260 NACL_KEY_WORLD_70
= 230,
261 NACL_KEY_WORLD_71
= 231,
262 NACL_KEY_WORLD_72
= 232,
263 NACL_KEY_WORLD_73
= 233,
264 NACL_KEY_WORLD_74
= 234,
265 NACL_KEY_WORLD_75
= 235,
266 NACL_KEY_WORLD_76
= 236,
267 NACL_KEY_WORLD_77
= 237,
268 NACL_KEY_WORLD_78
= 238,
269 NACL_KEY_WORLD_79
= 239,
270 NACL_KEY_WORLD_80
= 240,
271 NACL_KEY_WORLD_81
= 241,
272 NACL_KEY_WORLD_82
= 242,
273 NACL_KEY_WORLD_83
= 243,
274 NACL_KEY_WORLD_84
= 244,
275 NACL_KEY_WORLD_85
= 245,
276 NACL_KEY_WORLD_86
= 246,
277 NACL_KEY_WORLD_87
= 247,
278 NACL_KEY_WORLD_88
= 248,
279 NACL_KEY_WORLD_89
= 249,
280 NACL_KEY_WORLD_90
= 250,
281 NACL_KEY_WORLD_91
= 251,
282 NACL_KEY_WORLD_92
= 252,
283 NACL_KEY_WORLD_93
= 253,
284 NACL_KEY_WORLD_94
= 254,
285 NACL_KEY_WORLD_95
= 255,
298 NACL_KEY_KP_PERIOD
= 266,
299 NACL_KEY_KP_DIVIDE
= 267,
300 NACL_KEY_KP_MULTIPLY
= 268,
301 NACL_KEY_KP_MINUS
= 269,
302 NACL_KEY_KP_PLUS
= 270,
303 NACL_KEY_KP_ENTER
= 271,
304 NACL_KEY_KP_EQUALS
= 272,
306 /* arrow & insert/delete pad */
309 NACL_KEY_RIGHT
= 275,
311 NACL_KEY_INSERT
= 277,
314 NACL_KEY_PAGEUP
= 280,
315 NACL_KEY_PAGEDOWN
= 281,
335 NACL_KEY_NUMLOCK
= 300,
336 NACL_KEY_CAPSLOCK
= 301,
337 NACL_KEY_SCROLLOCK
= 302,
338 NACL_KEY_RSHIFT
= 303,
339 NACL_KEY_LSHIFT
= 304,
340 NACL_KEY_RCTRL
= 305,
341 NACL_KEY_LCTRL
= 306,
344 NACL_KEY_RMETA
= 309,
345 NACL_KEY_LMETA
= 310,
346 NACL_KEY_LSUPER
= 311,
347 NACL_KEY_RSUPER
= 312,
349 NACL_KEY_COMPOSE
= 314,
353 NACL_KEY_PRINT
= 316,
354 NACL_KEY_SYSREQ
= 317,
355 NACL_KEY_BREAK
= 318,
357 NACL_KEY_POWER
= 320,
361 /* Add any other keys here */
367 * Key modifier enumerations
368 * These values can be used as a bitset.
369 * Do not alter these mappings; they must match SDL.
372 /* mods represented as bitset */
373 NACL_KEYMOD_NONE
= 0x0000,
374 NACL_KEYMOD_LSHIFT
= 0x0001,
375 NACL_KEYMOD_RSHIFT
= 0x0002,
376 NACL_KEYMOD_LCTRL
= 0x0040,
377 NACL_KEYMOD_RCTRL
= 0x0080,
378 NACL_KEYMOD_LALT
= 0x0100,
379 NACL_KEYMOD_RALT
= 0x0200,
380 NACL_KEYMOD_LMETA
= 0x0400,
381 NACL_KEYMOD_RMETA
= 0x0800,
382 NACL_KEYMOD_NUM
= 0x1000,
383 NACL_KEYMOD_CAPS
= 0x2000,
384 NACL_KEYMOD_MODE
= 0x4000,
385 NACL_KEYMOD_RESERVED
= 0x8000
390 * Mouse Buttons. Do not alter these mappings; they must match SDL.
392 enum NaClMouseButton
{
393 NACL_MOUSE_BUTTON_LEFT
= 1,
394 NACL_MOUSE_BUTTON_MIDDLE
= 2,
395 NACL_MOUSE_BUTTON_RIGHT
= 3,
396 NACL_MOUSE_SCROLL_UP
= 4,
397 NACL_MOUSE_SCROLL_DOWN
= 5
403 * These values can be used as bitsets. Do not alter these mappings; they
406 enum NaClMouseState
{
407 NACL_MOUSE_STATE_LEFT_BUTTON_PRESSED
= 1,
408 NACL_MOUSE_STATE_MIDDLE_BUTTON_PRESSED
= 2,
409 NACL_MOUSE_STATE_RIGHT_BUTTON_PRESSED
= 4
414 * Gain enumerations for NaClMultimediaActiveEvent
415 * These values can be used as a bitset. Do not alter these mappings; they
419 NACL_ACTIVE_MOUSE
= 1, /**< mouse leaving/entering */
420 NACL_ACTIVE_INPUT_FOCUS
= 2, /**< input focus lost/restored */
421 NACL_ACTIVE_APPLICATION
= 4 /**< application minimized/restored */
426 * Key symbol structure
428 struct NaClMultimediaKeySymbol
{
429 uint8_t scancode
; /**< H/W scancode */
430 int16_t sym
; /**< NaClKey symbol */
431 int16_t mod
; /**< NaClKeyMod key modifier */
437 * Active event. Generated when mouse cursor exits/enters window,
438 * input focus is lost/gained, and application is minimized/restored.
440 struct NaClMultimediaActiveEvent
{
441 uint8_t type
; /**< NACL_EVENT_ACTIVE */
442 uint8_t gain
; /**< NaClActive gain */
443 uint8_t state
; /**< state 0 - lost, minimized, leaving
444 1 - acquired, restored, entering */
449 * Expose event. Generated when the windowing system requests
450 * an application redraw/repaint update. Upon receiving this
451 * event, an application should call nacl_video_update()
453 struct NaClMultimediaExposeEvent
{
454 uint8_t type
; /**< NACL_EVENT_EXPOSE */
459 * Keyboard event. For both key down and key up events.
461 struct NaClMultimediaKeyboardEvent
{
462 uint8_t type
; /**< NACL_EVENT_KEY_UP or NACL_EVENT_KEY_DOWN */
463 uint8_t which
; /**< which keyboard (0 for primary) */
464 uint8_t state
; /**< indicates pressed (1) or released (0) */
465 struct NaClMultimediaKeySymbol keysym
; /**< key info */
470 * Mouse motion event. Generated when mouse moved by user and
471 * application is in focus.
473 struct NaClMultimediaMouseMotionEvent
{
474 uint8_t type
; /**< NACL_EVENT_MOUSE_MOTION */
475 uint8_t which
; /**< which mouse (0 for primary) */
476 uint8_t state
; /**< NaClMouseState button state bitset */
477 uint16_t x
; /**< x position */
478 uint16_t y
; /**< y position */
479 int16_t xrel
; /**< relative x position */
480 int16_t yrel
; /**< relative y position */
485 * Mouse button event. Generated when user presses or releases
486 * a mouse button, including the scroll wheel.
488 struct NaClMultimediaMouseButtonEvent
{
489 uint8_t type
; /**< NACL_EVENT_MOUSE_BUTTON_UP or
490 NACL_EVENT_MOUSE_BUTTON_DOWN */
491 uint8_t which
; /**< which mouse (0 for primary) */
492 uint8_t button
; /**< NaClMouseButton which button */
493 uint8_t state
; /**< indicates pressed (1) or released (0) */
494 uint16_t x
; /**< x position */
495 uint16_t y
; /**< y position */
500 * Quit event. The application should quit when receiving this event.
501 * This includes shutting down the video subsystem with nacl_video_shutdown()
502 * and other active subsystems (audio) followed by shutting down the
503 * multimedia library with nacl_multimedia_shutdown().
505 struct NaClMultimediaQuitEvent
{
506 uint8_t type
; /**< NACL_EVENT_QUIT */
511 * Pad event. Not used, but defines the largest size the event union
512 * should ever be. Events added in the future should never be larger than
513 * this structure. 64 byte events should be enough for all sane events.
515 * *** Do not ever change the size of this structure. ***
516 * Doing so will break other existing native client applications
518 struct NaClMultimediaPadEvent
{
524 * The event wrapper. Use type field to select which structure to process.
525 * At all times, sizeof NaClMultimediaEvent must match sizeof
526 * NaClMultimediaPadEvent.
528 union NaClMultimediaEvent
{
529 uint8_t type
; /**< one of NaClEvent */
530 struct NaClMultimediaActiveEvent active
;
531 struct NaClMultimediaExposeEvent expose
;
532 struct NaClMultimediaKeyboardEvent key
;
533 struct NaClMultimediaMouseMotionEvent motion
;
534 struct NaClMultimediaMouseButtonEvent button
;
535 struct NaClMultimediaQuitEvent quit
;
536 struct NaClMultimediaPadEvent pad
;
546 * End of Audio/Video group
549 #endif /* NATIVE_CLIENT_SERVICE_RUNTIME_AUDIO_VIDEO_H_ */