1 /* multi_audio.h */ 2 3 /* Interface description for drivers implementing studio-level audio I/O with */ 4 /* possible auxillary functions (transport, time code, etc). */ 5 /* Copyright © 1998-1999 Be Incorporated. All rights reserved. */ 6 7 /* This is the first release candidate for the API. Unless we hear feedback that */ 8 /* forces a change before the end of August, we will try to stay binary compatible */ 9 /* with this interface. */ 10 /* Send feedback to trinity@be.com [1999-07-02] */ 11 12 #if !defined(_MULTI_AUDIO_H) 13 #define _MULTI_AUDIO_H 14 15 #include <Drivers.h> 16 #ifndef ASSERT 17 #include <Debug.h> 18 #endif 19 20 #define B_MULTI_DRIVER_BASE (B_AUDIO_DRIVER_BASE+20) 21 22 enum { /* open() modes */ 23 /* O_RDONLY is 0, O_WRONLY is 1, O_RDWR is 2 */ 24 B_MULTI_CONTROL = 3 25 }; 26 27 /* ioctl codes */ 28 enum { 29 /* multi_description */ 30 B_MULTI_GET_DESCRIPTION = B_MULTI_DRIVER_BASE, 31 /* multi_event_handling */ 32 B_MULTI_GET_EVENT_INFO, 33 B_MULTI_SET_EVENT_INFO, 34 B_MULTI_GET_EVENT, 35 /* multi_channel_enable */ 36 B_MULTI_GET_ENABLED_CHANNELS, 37 B_MULTI_SET_ENABLED_CHANNELS, 38 /* multi_format_info */ 39 B_MULTI_GET_GLOBAL_FORMAT, 40 B_MULTI_SET_GLOBAL_FORMAT, /* always sets for all channels, always implemented */ 41 /* multi_channel_formats */ 42 B_MULTI_GET_CHANNEL_FORMATS, 43 B_MULTI_SET_CHANNEL_FORMATS, /* only implemented if possible */ 44 /* multi_mix_value_info */ 45 B_MULTI_GET_MIX, 46 B_MULTI_SET_MIX, 47 /* multi_mix_channel_info */ 48 B_MULTI_LIST_MIX_CHANNELS, 49 /* multi_mix_control_info */ 50 B_MULTI_LIST_MIX_CONTROLS, 51 /* multi_mix_connection_info */ 52 B_MULTI_LIST_MIX_CONNECTIONS, 53 /* multi_buffer_list */ 54 B_MULTI_GET_BUFFERS, /* Fill out the struct for the first time; doesn't start anything. */ 55 B_MULTI_SET_BUFFERS, /* Set what buffers to use, if the driver supports soft buffers. */ 56 /* bigtime_t */ 57 B_MULTI_SET_START_TIME, /* When to actually start */ 58 /* multi_buffer_info */ 59 B_MULTI_BUFFER_EXCHANGE, /* stop and go are derived from this being called */ 60 B_MULTI_BUFFER_FORCE_STOP, /* force stop of playback */ 61 /* extension protocol */ 62 B_MULTI_LIST_EXTENSIONS, /* get a list of supported extensions */ 63 B_MULTI_GET_EXTENSION, /* get the value of an extension (or return error if not supported) */ 64 B_MULTI_SET_EXTENSION, /* set the value of an extension */ 65 /* multi_mode_list */ 66 B_MULTI_LIST_MODES, /* get a list of possible modes (multi_mode_list * arg) */ 67 B_MULTI_GET_MODE, /* get the current mode (int32 * arg) */ 68 B_MULTI_SET_MODE /* set a new mode (int32 * arg) */ 69 }; 70 71 /* sample rate values */ 72 /* various fixed sample rates we support (for hard-sync clocked values) */ 73 #define B_SR_8000 0x1 74 #define B_SR_11025 0x2 75 #define B_SR_12000 0x4 76 #define B_SR_16000 0x8 77 #define B_SR_22050 0x10 78 #define B_SR_24000 0x20 79 #define B_SR_32000 0x40 80 #define B_SR_44100 0x80 81 #define B_SR_48000 0x100 82 #define B_SR_64000 0x200 83 #define B_SR_88200 0x400 84 #define B_SR_96000 0x800 85 #define B_SR_176400 0x1000 86 #define B_SR_192000 0x2000 87 #define B_SR_384000 0x4000 88 #define B_SR_1536000 0x10000 89 /* continuously variable sample rate (typically board-generated) */ 90 #define B_SR_CVSR 0x10000000UL 91 /* sample rate parameter global to all channels (input and output rates respectively) */ 92 #define B_SR_IS_GLOBAL 0x80000000UL 93 /* output sample rate locked to input sample rate (output_rates only; the common case!) */ 94 #define B_SR_SAME_AS_INPUT 0x40000000UL 95 96 97 /* format values */ 98 /* signed char */ 99 #define B_FMT_8BIT_S 0x01 100 /* unsigned char -- this is special case */ 101 #define B_FMT_8BIT_U 0x02 102 /* traditional 16 bit signed format (host endian) */ 103 #define B_FMT_16BIT 0x10 104 /* left-adjusted in 32 bit signed word */ 105 #define B_FMT_18BIT 0x20 106 #define B_FMT_20BIT 0x40 107 #define B_FMT_24BIT 0x100 108 #define B_FMT_32BIT 0x1000 109 /* 32-bit floating point, -1.0 to 1.0 */ 110 #define B_FMT_FLOAT 0x20000 111 /* 64-bit floating point, -1.0 to 1.0 */ 112 #define B_FMT_DOUBLE 0x40000 113 /* 80-bit floating point, -1.0 to 1.0 */ 114 #define B_FMT_EXTENDED 0x80000 115 /* bit stream */ 116 #define B_FMT_BITSTREAM 0x1000000 117 /* format parameter global to all channels (input and output formats respectively) */ 118 #define B_FMT_IS_GLOBAL 0x80000000UL 119 /* output format locked to input format (output_formats) */ 120 #define B_FMT_SAME_AS_INPUT 0x40000000UL 121 122 /* possible sample lock sources */ 123 #define B_MULTI_LOCK_INPUT_CHANNEL 0x0 /* lock_source_data is channel id */ 124 #define B_MULTI_LOCK_INTERNAL 0x1 125 #define B_MULTI_LOCK_WORDCLOCK 0x2 126 #define B_MULTI_LOCK_SUPERCLOCK 0x4 127 #define B_MULTI_LOCK_LIGHTPIPE 0x8 128 #define B_MULTI_LOCK_VIDEO 0x10 /* or blackburst */ 129 #define B_MULTI_LOCK_FIRST_CARD 0x20 /* if you have more than one card */ 130 #define B_MULTI_LOCK_MTC 0x40 131 #define B_MULTI_LOCK_SPDIF 0x80 132 133 /* possible timecode sources */ 134 #define B_MULTI_TIMECODE_MTC 0x1 135 #define B_MULTI_TIMECODE_VTC 0x2 136 #define B_MULTI_TIMECODE_SMPTE 0x4 137 #define B_MULTI_TIMECODE_SUPERCLOCK 0x8 138 #define B_MULTI_TIMECODE_FIREWIRE 0x10 139 140 /* interface_flags values */ 141 /* Available functions on this device. */ 142 #define B_MULTI_INTERFACE_PLAYBACK 0x1 143 #define B_MULTI_INTERFACE_RECORD 0x2 144 #define B_MULTI_INTERFACE_TRANSPORT 0x4 145 #define B_MULTI_INTERFACE_TIMECODE 0x8 146 /* "Soft" buffers means you can change the pointer values and the driver will still be happy. */ 147 #define B_MULTI_INTERFACE_SOFT_PLAY_BUFFERS 0x10000 148 #define B_MULTI_INTERFACE_SOFT_REC_BUFFERS 0x20000 149 /* Whether the data stream is interrupted when changing channel enables. */ 150 #define B_MULTI_INTERFACE_CLICKS_WHEN_ENABLING_OUTPUTS 0x40000 151 #define B_MULTI_INTERFACE_CLICKS_WHEN_ENABLING_INPUTS 0x80000 152 153 #define B_CURRENT_INTERFACE_VERSION 0x4502 154 #define B_MINIMUM_INTERFACE_VERSION 0x4502 155 156 typedef struct multi_description multi_description; 157 typedef struct multi_channel_info multi_channel_info; 158 struct multi_description { 159 160 size_t info_size; /* sizeof(multi_description) */ 161 uint32 interface_version; /* current version of interface that's implemented */ 162 uint32 interface_minimum; /* minimum version required to understand driver */ 163 164 char friendly_name[32]; /* name displayed to user (C string) */ 165 char vendor_info[32]; /* name used internally by vendor (C string) */ 166 167 int32 output_channel_count; 168 int32 input_channel_count; 169 int32 output_bus_channel_count; 170 int32 input_bus_channel_count; 171 int32 aux_bus_channel_count; 172 173 int32 request_channel_count; /* how many channel_infos are there */ 174 multi_channel_info * 175 channels; 176 177 uint32 output_rates; 178 uint32 input_rates; 179 float min_cvsr_rate; 180 float max_cvsr_rate; 181 uint32 output_formats; 182 uint32 input_formats; 183 uint32 lock_sources; 184 uint32 timecode_sources; 185 186 uint32 interface_flags; 187 bigtime_t start_latency; /* how much in advance driver needs SET_START_TIME */ 188 189 uint32 _reserved_[11]; 190 191 char control_panel[64]; /* MIME type of control panel application */ 192 }; 193 194 #if !defined(_MEDIA_DEFS_H) /* enum in MediaDefs.h */ 195 /* designation values */ 196 /* mono channels have no designation */ 197 #define B_CHANNEL_LEFT 0x1 198 #define B_CHANNEL_RIGHT 0x2 199 #define B_CHANNEL_CENTER 0x4 /* 5.1+ or fake surround */ 200 #define B_CHANNEL_SUB 0x8 /* 5.1+ */ 201 #define B_CHANNEL_REARLEFT 0x10 /* quad surround or 5.1+ */ 202 #define B_CHANNEL_REARRIGHT 0x20 /* quad surround or 5.1+ */ 203 #define B_CHANNEL_FRONT_LEFT_CENTER 0x40 204 #define B_CHANNEL_FRONT_RIGHT_CENTER 0x80 205 #define B_CHANNEL_BACK_CENTER 0x100 /* 6.1 or fake surround */ 206 #define B_CHANNEL_SIDE_LEFT 0x200 207 #define B_CHANNEL_SIDE_RIGHT 0x400 208 #define B_CHANNEL_TOP_CENTER 0x800 209 #define B_CHANNEL_TOP_FRONT_LEFT 0x1000 210 #define B_CHANNEL_TOP_FRONT_CENTER 0x2000 211 #define B_CHANNEL_TOP_FRONT_RIGHT 0x4000 212 #define B_CHANNEL_TOP_BACK_LEFT 0x8000 213 #define B_CHANNEL_TOP_BACK_CENTER 0x10000 214 #define B_CHANNEL_TOP_BACK_RIGHT 0x20000 215 #endif 216 217 #define B_CHANNEL_MONO_BUS 0x4000000 218 #define B_CHANNEL_STEREO_BUS 0x2000000 /* + left/right */ 219 #define B_CHANNEL_SURROUND_BUS 0x1000000 /* multichannel */ 220 221 /* If you have interactions where some inputs can not be used when some */ 222 /* outputs are used, mark both inputs and outputs with this flag. */ 223 #define B_CHANNEL_INTERACTION 0x80000000UL 224 /* If input channel #n is simplexed with output channel #n, they should both */ 225 /* have this flag set (different from the previous flag, which is more vague). */ 226 #define B_CHANNEL_SIMPLEX 0x40000000UL 227 228 /* connector values */ 229 /* analog connectors */ 230 #define B_CHANNEL_RCA 0x1 231 #define B_CHANNEL_XLR 0x2 232 #define B_CHANNEL_TRS 0x4 233 #define B_CHANNEL_QUARTER_INCH_MONO 0x8 234 #define B_CHANNEL_MINI_JACK_STEREO 0x10 235 #define B_CHANNEL_QUARTER_INCH_STEREO 0x20 236 #define B_CHANNEL_ANALOG_HEADER 0x100 /* internal on card */ 237 #define B_CHANNEL_SNAKE 0x200 /* or D-sub */ 238 /* digital connectors (stereo) */ 239 #define B_CHANNEL_OPTICAL_SPDIF 0x1000 240 #define B_CHANNEL_COAX_SPDIF 0x2000 241 #define B_CHANNEL_COAX_EBU 0x4000 242 #define B_CHANNEL_XLR_EBU 0x8000 243 #define B_CHANNEL_TRS_EBU 0x10000 244 #define B_CHANNEL_SPDIF_HEADER 0x20000 /* internal on card */ 245 /* multi-channel digital connectors */ 246 #define B_CHANNEL_LIGHTPIPE 0x100000 247 #define B_CHANNEL_TDIF 0x200000 248 #define B_CHANNEL_FIREWIRE 0x400000 249 #define B_CHANNEL_USB 0x800000 250 /* If you have multiple output connectors, only one of which can */ 251 /* be active at a time. */ 252 #define B_CHANNEL_EXCLUSIVE_SELECTION 0x80000000UL 253 254 255 typedef enum { 256 B_MULTI_NO_CHANNEL_KIND, 257 B_MULTI_OUTPUT_CHANNEL = 0x1, 258 B_MULTI_INPUT_CHANNEL = 0x2, 259 B_MULTI_OUTPUT_BUS = 0x4, 260 B_MULTI_INPUT_BUS = 0x8, 261 B_MULTI_AUX_BUS = 0x10 262 } channel_kind; 263 264 struct multi_channel_info { 265 int32 channel_id; 266 channel_kind kind; 267 uint32 designations; 268 uint32 connectors; 269 uint32 _reserved_[4]; 270 }; 271 272 273 /* Constants */ 274 #define B_MULTI_EVENT_MINMAX 16 275 /* Event flags/masks */ 276 #define B_MULTI_EVENT_TRANSPORT 0x40000000UL 277 #define B_MULTI_EVENT_HAS_TIMECODE 0x80000000UL 278 279 /* possible transport events */ 280 #define B_MULTI_EVENT_NONE 0x00000000UL 281 #define B_MULTI_EVENT_START 0x40010000UL 282 #define B_MULTI_EVENT_LOCATION 0x40020000UL /* location when shuttling or locating */ 283 #define B_MULTI_EVENT_SHUTTLING 0x40040000UL 284 #define B_MULTI_EVENT_STOP 0x40080000UL 285 #define B_MULTI_EVENT_RECORD 0x40100000UL 286 #define B_MULTI_EVENT_PAUSE 0x40200000UL 287 #define B_MULTI_EVENT_RUNNING 0x40400000UL /* location when running */ 288 /* possible device events */ 289 enum { 290 B_MULTI_EVENT_STARTED = 0x1, 291 B_MULTI_EVENT_STOPPED = 0x2, 292 B_MULTI_EVENT_CHANNEL_FORMAT_CHANGED= 0x4, 293 B_MULTI_EVENT_BUFFER_OVERRUN = 0x8, 294 B_MULTI_EVENT_SIGNAL_LOST = 0x10, 295 B_MULTI_EVENT_SIGNAL_DETECTED = 0x20, 296 B_MULTI_EVENT_CLOCK_LOST = 0x40, 297 B_MULTI_EVENT_CLOCK_DETECTED = 0x80, 298 B_MULTI_EVENT_NEW_MODE = 0x100, 299 B_MULTI_EVENT_CONTROL_CHANGED = 0x200 300 }; 301 302 typedef struct multi_get_event_info multi_get_event_info; 303 struct multi_get_event_info { 304 size_t info_size; /* sizeof(multi_get_event_info) */ 305 uint32 supported_mask; /* what events h/w supports */ 306 uint32 current_mask; /* current driver value */ 307 uint32 queue_size; /* current queue size */ 308 uint32 event_count; /* number of events currently in queue*/ 309 uint32 _reserved[3]; 310 }; 311 312 typedef struct multi_set_event_info multi_set_event_info; 313 struct multi_set_event_info { 314 size_t info_size; /* sizeof(multi_set_event_info) */ 315 uint32 in_mask; /* what events to wait for */ 316 int32 semaphore; /* semaphore app will wait on */ 317 uint32 queue_size; /* minimum number of events to save */ 318 uint32 _reserved[4]; 319 }; 320 321 typedef struct multi_get_event multi_get_event; 322 struct multi_get_event { 323 size_t info_size; /* sizeof(multi_get_event) */ 324 uint32 event; 325 bigtime_t timestamp; /* real time at which event was received */ 326 int32 count; /* used for configuration events */ 327 union { 328 int32 channels[100]; 329 uint32 clocks; 330 int32 mode; 331 int32 controls[100]; 332 struct { /* transport event */ 333 float out_rate; /* what rate it's now playing at */ 334 int32 out_hours; /* location at the time given */ 335 int32 out_minutes; 336 int32 out_seconds; 337 int32 out_frames; 338 }transport; 339 char _reserved_[400]; 340 #if defined(__cplusplus) 341 }; 342 #else 343 } u; 344 #endif 345 uint32 _reserved_1[10]; 346 }; 347 348 typedef struct multi_channel_enable multi_channel_enable; 349 struct multi_channel_enable { 350 size_t info_size; /* sizeof(multi_channel_enable) */ 351 /* this must have bytes for all channels (see multi_description) */ 352 /* channel 0 is lowest bit of first byte */ 353 uchar * enable_bits; 354 355 uint32 lock_source; 356 int32 lock_data; 357 uint32 timecode_source; 358 uint32 * connectors; /* which connector(s) is/are active, per channel */ 359 }; 360 361 #include <stdio.h> 362 363 #if defined(__cplusplus) 364 inline void B_SET_CHANNEL(void * bits, int channel, bool value) 365 { 366 ASSERT(channel>=0); 367 (((uchar *)(bits))[((channel)&0x7fff)>>3] = 368 (((uchar *)(bits))[((channel)&0x7fff)>>3] & ~(1<<((channel)&0x7))) | 369 ((value) ? (1<<((channel)&0x7)) : 0)); 370 } 371 inline bool B_TEST_CHANNEL(const void * bits, int channel) 372 { 373 return ((((uchar *)(bits))[((channel)&0x7fff)>>3] >> ((channel)&0x7)) & 1); 374 } 375 #else 376 #define B_SET_CHANNEL(bits, channel, value) \ 377 ASSERT(channel>=0); \ 378 (((uchar *)(bits))[((channel)&0x7fff)>>3] = \ 379 (((uchar *)(bits))[((channel)&0x7fff)>>3] & ~(1<<((channel)&0x7))) | \ 380 ((value) ? (1<<((channel)&0x7)) : 0)) 381 #define B_TEST_CHANNEL(bits, channel) \ 382 ((((uchar *)(bits))[((channel)&0x7fff)>>3] >> ((channel)&0x7)) & 1) 383 #endif 384 385 typedef struct multi_channel_formats multi_channel_formats; 386 typedef struct multi_format_info multi_format_info; 387 typedef struct _multi_format _multi_format; 388 389 struct _multi_format { 390 uint32 rate; 391 float cvsr; 392 uint32 format; 393 uint32 _reserved_[3]; 394 }; 395 enum { /* timecode kinds */ 396 B_MULTI_NO_TIMECODE, 397 B_MULTI_TIMECODE_30, /* MIDI */ 398 B_MULTI_TIMECODE_30_DROP_2, /* NTSC */ 399 B_MULTI_TIMECODE_30_DROP_4, /* Brazil */ 400 B_MULTI_TIMECODE_25, /* PAL */ 401 B_MULTI_TIMECODE_24 /* Film */ 402 }; 403 struct multi_format_info { 404 size_t info_size; /* sizeof(multi_format_info) */ 405 bigtime_t output_latency; 406 bigtime_t input_latency; 407 int32 timecode_kind; 408 uint32 _reserved_[7]; 409 _multi_format input; 410 _multi_format output; 411 }; 412 struct multi_channel_formats { 413 size_t info_size; /* sizeof(multi_channel_formats) */ 414 int32 request_channel_count; 415 int32 request_first_channel; 416 int32 returned_channel_count; 417 int32 timecode_kind; 418 int32 _reserved_[4]; 419 _multi_format * 420 channels; 421 bigtime_t * latencies; /* DMA/hardware latencies; client calculates for buffers */ 422 }; 423 424 425 typedef struct multi_mix_value multi_mix_value; 426 struct multi_mix_value { 427 int32 id; 428 union { 429 float gain; 430 uint32 mux; /* bitmask of mux points */ 431 bool enable; 432 uint32 _reserved_[2]; 433 #if defined(__cplusplus) 434 }; 435 #else 436 } u; 437 #endif 438 int32 ramp; 439 uint32 _reserved_2[2]; 440 }; 441 442 typedef struct multi_mix_value_info multi_mix_value_info; 443 struct multi_mix_value_info { 444 size_t info_size; /* sizeof(multi_mix_value_info) */ 445 int32 item_count; 446 multi_mix_value * 447 values; 448 int32 at_frame; /* time at which to start the change */ 449 }; 450 451 // only one of these should be set 452 #define B_MULTI_MIX_JUNCTION 0x1 453 #define B_MULTI_MIX_GAIN 0x2 454 #define B_MULTI_MIX_MUX 0x4 455 #define B_MULTI_MIX_ENABLE 0x8 456 #define B_MULTI_MIX_GROUP 0x10 457 #define B_MULTI_MIX_KIND_MASK 0xffff 458 459 #define B_MULTI_MIX_MUX_VALUE 0x0104 460 // any combination of these can be set 461 #define B_MULTI_MIX_RAMP 0x10000 462 463 enum strind_id { 464 S_null = 0, S_OUTPUT, S_INPUT, S_SETUP, S_TONE_CONTROL, S_EXTENDED_SETUP, 465 S_ENHANDED_SETUP, S_MASTER, S_BEEP, S_PHONE, S_MIC, S_LINE, S_CD, S_VIDEO, 466 S_AUX, S_WAVE, S_GAIN, S_LEVEL, S_VOLUME, S_MUTE, S_ENABLE, S_STEREO_MIX, 467 S_MONO_MIX, S_OUTPUT_STEREO_MIX, S_OUTPUT_MONO_MIX, S_OUTPUT_BASS, 468 S_OUTPUT_TREBLE, S_OUTPUT_3D_CENTER, S_OUTPUT_3D_DEPTH, 469 S_HEADPHONE, S_SPDIF, 470 S_USERID = 1000000 471 }; 472 473 typedef struct multi_mix_control multi_mix_control; 474 struct multi_mix_control { 475 int32 id; /* unique for device -- not same id as any channel/bus ! */ 476 uint32 flags; /* including kind */ 477 int32 master; /* or 0 if it's not slaved */ 478 union { 479 struct { 480 float min_gain; /* dB */ 481 float max_gain; /* dB */ 482 float granularity; /* dB */ 483 } gain; 484 struct { 485 uint32 _reserved; 486 } mux; 487 struct { 488 uint32 _reserved; 489 } enable; 490 uint32 _reserved[12]; 491 #if defined(__cplusplus) 492 }; 493 #else 494 } u; 495 #endif 496 enum strind_id string; /* string id (S_null : use name) */ 497 int32 parent; /* parent id */ 498 char name[48]; 499 }; 500 501 typedef struct multi_mix_channel_info multi_mix_channel_info; 502 struct multi_mix_channel_info { 503 size_t info_size; /* sizeof(multi_mix_channel_info) */ 504 int32 channel_count; 505 int32 * channels; /* allocated by caller, lists requested channels */ 506 int32 max_count; /* in: control ids per channel */ 507 int32 actual_count; /* out: actual max # controls for any individual requested channel */ 508 int32 ** controls; 509 }; 510 511 typedef struct multi_mix_control_info multi_mix_control_info; 512 struct multi_mix_control_info { 513 size_t info_size; /* sizeof(multi_mix_control_info) */ 514 int32 control_count; /* in: number of controls */ 515 multi_mix_control * 516 controls; /* allocated by caller, returns control description for each */ 517 }; 518 519 typedef struct multi_mix_connection multi_mix_connection; 520 struct multi_mix_connection { 521 int32 from; 522 int32 to; 523 uint32 _reserved_[2]; 524 }; 525 526 typedef struct multi_mix_connection_info multi_mix_connection_info; 527 struct multi_mix_connection_info { 528 size_t info_size; 529 int32 max_count; /* in: available space */ 530 int32 actual_count; /* out: actual count */ 531 multi_mix_connection * 532 connections; /* allocated by caller, returns connections */ 533 }; 534 535 536 /* possible flags values for what is available (in and out) */ 537 #define B_MULTI_BUFFER_PLAYBACK 0x1 538 #define B_MULTI_BUFFER_RECORD 0x2 539 #define B_MULTI_BUFFER_METERING 0x4 540 #define B_MULTI_BUFFER_TIMECODE 0x40000 541 542 typedef struct multi_buffer_list multi_buffer_list; 543 typedef struct buffer_desc buffer_desc; 544 /* This struct is used to query the driver about what buffers it will use, */ 545 /* and to tell it what buffers to use if it supports soft buffers. */ 546 struct multi_buffer_list { 547 548 size_t info_size; /* sizeof(multi_buffer_list) */ 549 uint32 flags; 550 551 int32 request_playback_buffers; 552 int32 request_playback_channels; 553 uint32 request_playback_buffer_size; /* frames per buffer */ 554 int32 return_playback_buffers; /* playback_buffers[b][] */ 555 int32 return_playback_channels; /* playback_buffers[][c] */ 556 uint32 return_playback_buffer_size; /* frames */ 557 buffer_desc ** playback_buffers; 558 void * _reserved_1; 559 560 int32 request_record_buffers; 561 int32 request_record_channels; 562 uint32 request_record_buffer_size; /* frames per buffer */ 563 int32 return_record_buffers; 564 int32 return_record_channels; 565 uint32 return_record_buffer_size; /* frames */ 566 buffer_desc ** record_buffers; 567 void * _reserved_2; 568 569 }; 570 571 struct buffer_desc { 572 char * base; /* pointer to first sample for channel for buffer */ 573 size_t stride; /* offset to next sample */ 574 uint32 _reserved_[2]; 575 }; 576 577 578 /* This struct is used when actually queuing data to be played, and/or */ 579 /* receiving data from a recorder. */ 580 typedef struct multi_buffer_info multi_buffer_info; 581 struct multi_buffer_info { 582 583 size_t info_size; /* sizeof(multi_buffer_info) */ 584 uint32 flags; 585 586 bigtime_t played_real_time; 587 bigtime_t played_frames_count; 588 int32 _reserved_0; 589 int32 playback_buffer_cycle; 590 591 bigtime_t recorded_real_time; 592 bigtime_t recorded_frames_count; 593 int32 _reserved_1; 594 int32 record_buffer_cycle; 595 596 int32 meter_channel_count; 597 char * meters_peak; /* in the same format as the data; allocated by caller */ 598 char * meters_average; /* in the same format as the data; allocated by caller */ 599 600 /* timecode sent and received at buffer swap */ 601 int32 hours; 602 int32 minutes; 603 int32 seconds; 604 int32 tc_frames; /* for timecode frames as opposed to sample frames */ 605 int32 at_frame_delta; /* how far into buffer (or before buffer for negative) */ 606 607 }; 608 609 610 typedef struct multi_mode_info multi_mode_info; 611 typedef struct multi_mode_list multi_mode_list; 612 613 struct multi_mode_list { 614 size_t info_size; /* sizeof(multi_mode_list) */ 615 int32 in_request_count; 616 int32 out_actual_count; 617 int32 out_current_mode; 618 multi_mode_info * 619 io_modes; 620 }; 621 622 struct multi_mode_info { 623 int32 mode_id; 624 uint32 flags; 625 char mode_name[64]; 626 int32 input_channel_count; 627 int32 output_channel_count; 628 float best_frame_rate_in; 629 float best_frame_rate_out; 630 uint32 sample_formats_in; 631 uint32 sample_formats_out; 632 char _reserved[160]; 633 }; 634 635 636 /* This extension protocol can grow however much you want. */ 637 /* Good extensions should be put into this header; really */ 638 /* good extensions should become part of the regular API. */ 639 /* For developer-developed extensions, use all lowercase */ 640 /* and digits (no upper case). If we then bless a third- */ 641 /* party extension, we can just upper-case the selector. */ 642 643 typedef struct multi_extension_list multi_extension_list; 644 typedef struct multi_extension_info multi_extension_info; 645 struct multi_extension_info { 646 uint32 code; 647 uint32 flags; 648 char name[24]; 649 }; 650 651 #define B_MULTI_MAX_EXTENSION_COUNT 31 652 struct multi_extension_list { /* MULTI_LIST_EXTENSIONS */ 653 size_t info_size; /* sizeof(multi_extension_list) */ 654 uint32 max_count; 655 int32 actual_count; /* return # of actual extensions */ 656 multi_extension_info * 657 extensions; /* allocated by caller */ 658 }; 659 660 typedef struct multi_extension_cmd multi_extension_cmd; 661 struct multi_extension_cmd { /* MULTI_GET_EXTENSION and MULTI_SET_EXTENSION */ 662 size_t info_size; /* sizeof(multi_extension_cmd) */ 663 uint32 code; 664 uint32 _reserved_1; 665 void * in_data; 666 size_t in_size; 667 void * out_data; 668 size_t out_size; 669 }; 670 671 enum { 672 B_MULTI_EX_CLOCK_GENERATION = 'CLGE', 673 B_MULTI_EX_DIGITAL_FORMAT = 'DIFO', 674 B_MULTI_EX_OUTPUT_NOMINAL = 'OUNO', 675 B_MULTI_EX_INPUT_NOMINAL = 'INNO' 676 }; 677 678 typedef struct multi_ex_clock_generation multi_ex_clock_generation; 679 struct multi_ex_clock_generation { 680 int32 channel; /* if specific, or -1 for all */ 681 uint32 clock; /* WORDCLOCK or SUPERCLOCK, typically */ 682 }; 683 684 typedef struct multi_ex_digital_format multi_ex_digital_format; 685 struct multi_ex_digital_format { 686 int32 channel; /* if specific, or -1 for all */ 687 uint32 format; /* B_CHANNEL_*_SPDIF or B_CHANNEL_*_EBU */ 688 }; 689 690 enum { 691 B_MULTI_NOMINAL_MINUS_10 = 1, 692 B_MULTI_NOMINAL_PLUS_4 693 }; 694 695 typedef struct multi_ex_nominal_level multi_ex_nominal_level; 696 struct multi_ex_nominal_level { 697 int32 channel; /* if specific, or -1 for all */ 698 int32 level; 699 }; 700 701 #endif /* _MULTI_AUDIO_H */ 702 703