annotate include/BeagleRT.h @ 68:59edd5780fef

Changed d-box code to run cleanly when built on board. Updated Makefile to add ne10 include path on board. Some extra docs in Utilities.h
author andrewm
date Fri, 17 Jul 2015 16:57:08 +0100
parents 3c3a1357657d
children e63563507edd
rev   line source
andrewm@47 1 /**
andrewm@47 2 * @file
andrewm@47 3 * @brief Main BeagleRT public API
andrewm@46 4 *
andrewm@46 5 * Central control code for hard real-time audio on BeagleBone Black
andrewm@46 6 * using PRU and Xenomai Linux extensions. This code began as part
andrewm@46 7 * of the Hackable Instruments project (EPSRC) at Queen Mary University
andrewm@46 8 * of London, 2013-14.
andrewm@46 9 *
andrewm@47 10 * (c) 2014-15 Andrew McPherson, Victor Zappi and Giulio Moro,
andrewm@46 11 * Queen Mary University of London
andrewm@46 12 */
andrewm@46 13
andrewm@48 14 /**
andrewm@48 15 * \mainpage
andrewm@48 16 *
andrewm@48 17 * BeagleRT is a hard-real-time, ultra-low latency audio and sensor environment for
andrewm@48 18 * BeagleBone Black, which works with the BeagleBone Audio Cape or a custom "BeagleRT Cape"
andrewm@48 19 * which incorporates stereo audio with 8x, 16-bit analog inputs and outputs.
andrewm@48 20 *
andrewm@48 21 * BeagleRT is based on the Xenomai real-time Linux extensions (http://xenomai.org) and
andrewm@48 22 * uses the BeagleBone %PRU subsystem to address the audio and sensor hardware.
andrewm@48 23 *
andrewm@48 24 * Further information can be found at http://beaglert.cc
andrewm@48 25 */
andrewm@48 26
andrewm@46 27
andrewm@46 28 #ifndef BEAGLERT_H_
andrewm@46 29 #define BEAGLERT_H_
andrewm@46 30
andrewm@46 31 #include <stdint.h>
andrewm@55 32 #include <rtdk.h>
andrewm@46 33 #include "digital_gpio_mapping.h"
andrewm@46 34
andrewm@46 35 // Useful constants
andrewm@47 36
andrewm@47 37 /** \cond PRIVATE */
andrewm@46 38 #define DBOX_CAPE // New custom cape
andrewm@46 39 #ifdef DBOX_CAPE
andrewm@46 40 #define CODEC_I2C_ADDRESS 0x18 // Address of TLV320AIC3104 codec
andrewm@46 41 #else
andrewm@46 42 #define CODEC_I2C_ADDRESS 0x1B // Address of TLV320AIC3106 codec
andrewm@46 43 #endif
andrewm@46 44
andrewm@46 45 #define MAX_PRU_FILENAME_LENGTH 256
andrewm@46 46 #define MAX_SERVERNAME_LENGTH 256
andrewm@47 47 /** \endcond */
andrewm@46 48
andrewm@47 49 /**
andrewm@47 50 * \ingroup auxtask
andrewm@47 51 *
andrewm@47 52 * Xenomai priority level for audio processing. Maximum possible priority is 99.
andrewm@47 53 * In general, all auxiliary tasks should have a level lower than this unless for\
andrewm@47 54 * special purposes where the task needs to interrupt audio processing.
andrewm@47 55 */
andrewm@46 56 #define BEAGLERT_AUDIO_PRIORITY 95
andrewm@46 57
andrewm@47 58 // Default volume levels
andrewm@47 59
andrewm@47 60 /**
andrewm@47 61 * \addtogroup levels
andrewm@47 62 *
andrewm@47 63 * @{
andrewm@47 64 */
andrewm@47 65
andrewm@47 66 /**
andrewm@47 67 * Default level of the audio DAC in decibels. See BeagleRT_setDACLevel().
andrewm@47 68 */
andrewm@47 69 #define DEFAULT_DAC_LEVEL 0.0
andrewm@47 70
andrewm@47 71 /**
andrewm@47 72 * Default level of the audio ADC in decibels. See BeagleRT_setADCLevel().
andrewm@47 73 */
andrewm@47 74 #define DEFAULT_ADC_LEVEL -6.0
andrewm@47 75
andrewm@47 76 /**
andrewm@47 77 * Default level of the headphone output in decibels. See BeagleRT_setHeadphoneLevel().
andrewm@47 78 */
andrewm@47 79 #define DEFAULT_HP_LEVEL -6.0
andrewm@47 80 /** @} */
andrewm@47 81
andrewm@47 82 /**
andrewm@47 83 * Flag for BeagleRTContext. If set, indicates the audio and analog buffers are interleaved.
andrewm@47 84 */
andrewm@46 85 #define BEAGLERT_FLAG_INTERLEAVED (1 << 0) // Set if buffers are interleaved
andrewm@47 86 /**
andrewm@47 87 * Flag for BeagleRTContext. If set, indicates analog outputs persist for future frames.
andrewm@47 88 */
andrewm@46 89 #define BEAGLERT_FLAG_ANALOG_OUTPUTS_PERSIST (1 << 1) // Set if analog/digital outputs persist for future buffers
andrewm@46 90
andrewm@47 91 /**
andrewm@47 92 * \ingroup control
andrewm@47 93 * \brief Structure containing initialisation parameters for the real-time
andrewm@47 94 * audio control system.
andrewm@47 95 *
andrewm@47 96 * This structure is initialised using BeagleRT_defaultSettings(). Its contents
andrewm@47 97 * are used up through the point of calling
andrewm@47 98 * BeagleRT_initAudio() at which point it is no longer needed.
andrewm@47 99 */
andrewm@46 100 typedef struct {
andrewm@46 101 // These items might be adjusted by the user:
andrewm@46 102
andrewm@47 103 /// \brief Number of (analog) frames per period.
andrewm@47 104 ///
andrewm@47 105 /// Number of audio frames depends on relative sample rates of the two. By default,
andrewm@47 106 /// audio is twice the sample rate, so has twice the period size.
andrewm@47 107 int periodSize;
andrewm@47 108 /// Whether to use the analog input and output
andrewm@47 109 int useAnalog;
andrewm@47 110 /// Whether to use the 16 programmable GPIOs
andrewm@47 111 int useDigital;
andrewm@47 112 /// How many channels for the ADC and DAC
andrewm@47 113 int numAnalogChannels;
andrewm@47 114 /// How many channels for the GPIOs
andrewm@47 115 int numDigitalChannels;
andrewm@46 116
andrewm@47 117 /// Whether to begin with the speakers muted
andrewm@47 118 int beginMuted;
andrewm@47 119 /// Level for the audio DAC output
andrewm@47 120 float dacLevel;
andrewm@47 121 /// Level for the audio ADC input
andrewm@47 122 float adcLevel;
andrewm@47 123 /// Level for the headphone output
andrewm@47 124 float headphoneLevel;
andrewm@47 125
andrewm@47 126 /// The external .bin file to load. If empty will use PRU code from pru_rtaudio_bin.h
andrewm@47 127 char pruFilename[MAX_PRU_FILENAME_LENGTH];
andrewm@47 128 /// Whether to use verbose logging
andrewm@47 129 int verbose;
andrewm@46 130
andrewm@46 131 // These items are application-dependent but should probably be
andrewm@46 132 // determined by the programmer rather than the user
andrewm@47 133
andrewm@47 134 /// Whether audio/analog data should be interleaved
andrewm@47 135 int interleave;
andrewm@47 136 /// \brief Whether analog outputs should persist to future frames.
andrewm@47 137 ///
andrewm@47 138 /// n.b. digital pins always persist, audio never does
andrewm@47 139 int analogOutputsPersist;
andrewm@46 140
andrewm@46 141 // These items are hardware-dependent and should only be changed
andrewm@46 142 // to run on different hardware
andrewm@47 143
andrewm@47 144 /// Where the codec can be found on the I2C bus
andrewm@47 145 int codecI2CAddress;
andrewm@47 146 /// Pin where amplifier mute can be found
andrewm@47 147 int ampMutePin;
andrewm@47 148 /// Port where the UDP server will listen
andrewm@47 149 int receivePort;
andrewm@47 150 /// Port where the UDP client will transmit
andrewm@47 151 int transmitPort;
andrewm@46 152 char serverName[MAX_SERVERNAME_LENGTH];
andrewm@46 153 } BeagleRTInitSettings;
andrewm@46 154
andrewm@46 155
andrewm@47 156 /**
andrewm@47 157 * \ingroup render
andrewm@47 158 * \brief Structure holding current audio and sensor settings and pointers to data buffers.
andrewm@47 159 *
andrewm@56 160 * This structure is passed to setup(), render() and cleanup(). It is
andrewm@47 161 * initialised in BeagleRT_initAudio() based on the contents of the BeagleRTInitSettings
andrewm@47 162 * structure.
andrewm@47 163 */
andrewm@46 164 typedef struct {
andrewm@47 165 /// \brief Buffer holding audio input samples
andrewm@47 166 ///
andrewm@47 167 /// This buffer may be in either interleaved or non-interleaved format,
andrewm@47 168 /// depending on the contents of the BeagleRTInitSettings structure.
andrewm@47 169 /// \b Note: this element is available in render() only.
andrewm@46 170 float *audioIn;
andrewm@47 171
andrewm@47 172 /// \brief Buffer holding audio output samples
andrewm@47 173 ///
andrewm@47 174 /// This buffer may be in either interleaved or non-interleaved format,
andrewm@47 175 /// depending on the contents of the BeagleRTInitSettings structure.
andrewm@47 176 /// \b Note: this element is available in render() only.
andrewm@46 177 float *audioOut;
andrewm@47 178
andrewm@47 179 /// \brief Buffer holding analog input samples
andrewm@47 180 ///
andrewm@47 181 /// This buffer may be in either interleaved or non-interleaved format,
andrewm@47 182 /// depending on the contents of the BeagleRTInitSettings structure.
andrewm@47 183 /// \b Note: this element is available in render() only.
andrewm@46 184 float *analogIn;
andrewm@47 185
andrewm@47 186 /// \brief Buffer holding analog output samples
andrewm@47 187 ///
andrewm@47 188 /// This buffer may be in either interleaved or non-interleaved format,
andrewm@47 189 /// depending on the contents of the BeagleRTInitSettings structure.
andrewm@47 190 /// \b Note: this element is available in render() only.
andrewm@46 191 float *analogOut;
andrewm@47 192
andrewm@47 193 /// \brief Buffer holding digital input/output samples
andrewm@47 194 ///
andrewm@47 195 /// \b Note: this element is available in render() only.
andrewm@46 196 uint32_t *digital;
andrewm@46 197
andrewm@47 198 /// Number of audio frames per period
andrewm@46 199 uint32_t audioFrames;
andrewm@47 200 /// Number of audio channels (currently always 2)
andrewm@46 201 uint32_t audioChannels;
andrewm@47 202 /// Audio sample rate in Hz (currently always 44100.0)
andrewm@46 203 float audioSampleRate;
andrewm@46 204
andrewm@47 205 /// \brief Number of analog frames per period
andrewm@47 206 ///
andrewm@47 207 /// This will be 0 if analog I/O is disabled.
andrewm@46 208 uint32_t analogFrames;
andrewm@47 209
andrewm@47 210 /// \brief Number of analog channels
andrewm@47 211 ///
andrewm@47 212 /// This could take a value of 8, 4 or 2. This will be 0 if analog I/O is disabled.
andrewm@46 213 uint32_t analogChannels;
andrewm@47 214
andrewm@47 215 /// \brief Analog sample rate in Hz
andrewm@47 216 ///
andrewm@47 217 /// The analog sample rate depends on the number of analog channels used. If
andrewm@47 218 /// 8 channels are used, the sample rate is 22050. If 4 channels are used, the sample
andrewm@47 219 /// rate is 44100. If 2 channels are used, the sample rate is 88200. If analog I/O
andrewm@47 220 /// is disabled, the sample rate is 0.
andrewm@46 221 float analogSampleRate;
andrewm@46 222
andrewm@47 223 /// Number of digital frames per period
andrewm@46 224 uint32_t digitalFrames;
andrewm@47 225 /// \brief Number of digital channels
andrewm@47 226 ///
andrewm@47 227 /// Currently this will always be 16, unless digital I/O is disabled, in which case it will be 0.
andrewm@46 228 uint32_t digitalChannels;
andrewm@47 229 /// Digital sample rate in Hz (currently always 44100.0)
andrewm@46 230 float digitalSampleRate;
andrewm@46 231
andrewm@47 232 /// \brief Number of elapsed audio samples since the start of rendering.
andrewm@47 233 ///
andrewm@47 234 /// This holds the total number of audio samples as of the beginning of the current period. To
andrewm@47 235 /// find the current number of analog or digital samples elapsed, multiply by the ratio of the
andrewm@47 236 /// sample rates (e.g. half the number of analog samples will have elapsed if the analog sample
andrewm@47 237 /// rate is 22050).
andrewm@46 238 uint64_t audioSampleCount;
andrewm@47 239
andrewm@47 240 /// \brief Other audio/sensor settings
andrewm@47 241 ///
andrewm@47 242 /// Binary combination of flags including:
andrewm@47 243 ///
andrewm@47 244 /// BEAGLERT_FLAG_INTERLEAVED: indicates the audio and analog buffers are interleaved
andrewm@47 245 ///
andrewm@47 246 /// BEAGLERT_FLAG_ANALOG_OUTPUTS_PERSIST: indicates that writes to the analog outputs will
andrewm@47 247 /// persist for future frames. If not set, writes affect one frame only.
andrewm@46 248 uint32_t flags;
andrewm@46 249 } BeagleRTContext;
andrewm@46 250
andrewm@47 251 /** \ingroup auxtask
andrewm@47 252 *
andrewm@47 253 * Auxiliary task variable. Auxiliary tasks are created using createAuxiliaryTask() and
andrewm@56 254 * automatically cleaned up after cleanup() finishes.
andrewm@47 255 */
andrewm@46 256 typedef void* AuxiliaryTask; // Opaque data type to keep track of aux tasks
andrewm@46 257
andrewm@47 258 /** \ingroup render
andrewm@47 259 *
andrewm@47 260 * Flag that indicates when the audio will stop. Threads can poll this variable to indicate when
andrewm@47 261 * they should stop. Additionally, a program can set this to \c true
andrewm@47 262 * to indicate that audio processing should terminate. Calling BeagleRT_stopAudio()
andrewm@47 263 * has the effect of setting this to \c true.
andrewm@47 264 */
andrewm@46 265 extern bool gShouldStop;
andrewm@46 266
andrewm@46 267 // *** User-defined render functions ***
andrewm@46 268
andrewm@46 269 /**
andrewm@47 270 * \defgroup render User-defined render functions
andrewm@47 271 *
andrewm@47 272 * These three functions must be implemented by the developer in every BeagleRT program.
andrewm@47 273 * Typically they appear in their own .cpp source file.
andrewm@47 274 *
andrewm@47 275 * @{
andrewm@47 276 */
andrewm@47 277
andrewm@47 278 /**
andrewm@46 279 * \brief User-defined initialisation function which runs before audio rendering begins.
andrewm@46 280 *
andrewm@46 281 * This function runs once at the beginning of the program, after most of the system
andrewm@46 282 * initialisation has begun but before audio rendering starts. Use it to prepare any
andrewm@46 283 * memory or resources that will be needed in render().
andrewm@46 284 *
andrewm@46 285 * \param context Data structure holding information on sample rates, numbers of channels,
andrewm@46 286 * frame sizes and other state. Note: the buffers for audio, analog and digital data will
andrewm@46 287 * \b not yet be available to use. Do not attempt to read or write audio or sensor data
andrewm@56 288 * in setup().
andrewm@46 289 * \param userData An opaque pointer to an optional user-defined data structure. Whatever
andrewm@46 290 * is passed as the second argument to BeagleRT_initAudio() will appear here.
andrewm@46 291 *
andrewm@46 292 * \return true on success, or false if an error occurred. If no initialisation is
andrewm@56 293 * required, setup() should return true.
andrewm@46 294 */
andrewm@56 295 bool setup(BeagleRTContext *context, void *userData);
andrewm@46 296
andrewm@46 297 /**
andrewm@46 298 * \brief User-defined callback function to process audio and sensor data.
andrewm@46 299 *
andrewm@46 300 * This function is called regularly by the system every time there is a new block of
andrewm@46 301 * audio and/or sensor data to process. Your code should process the requested samples
andrewm@46 302 * of data, store the results within \c context, and return.
andrewm@46 303 *
andrewm@46 304 * \param context Data structure holding buffers for audio, analog and digital data. The
andrewm@46 305 * structure also holds information on numbers of channels, frame sizes and sample rates,
andrewm@46 306 * which are guaranteed to remain the same throughout the program and to match what was
andrewm@56 307 * passed to setup().
andrewm@46 308 * \param userData An opaque pointer to an optional user-defined data structure. Will
andrewm@56 309 * be the same as the \c userData parameter passed to setup().
andrewm@46 310 */
andrewm@46 311 void render(BeagleRTContext *context, void *userData);
andrewm@46 312
andrewm@46 313 /**
andrewm@46 314 * \brief User-defined cleanup function which runs when the program finishes.
andrewm@46 315 *
andrewm@46 316 * This function is called by the system once after audio rendering has finished, before the
andrewm@56 317 * program quits. Use it to release any memory allocated in setup() and to perform
andrewm@56 318 * any other required cleanup. If no initialisation is performed in setup(), then
andrewm@46 319 * this function will usually be empty.
andrewm@46 320 *
andrewm@46 321 * \param context Data structure holding information on sample rates, numbers of channels,
andrewm@46 322 * frame sizes and other state. Note: the buffers for audio, analog and digital data will
andrewm@46 323 * no longer be available to use. Do not attempt to read or write audio or sensor data
andrewm@56 324 * in cleanup().
andrewm@46 325 * \param userData An opaque pointer to an optional user-defined data structure. Will
andrewm@56 326 * be the same as the \c userData parameter passed to setup() and render().
andrewm@46 327 */
andrewm@56 328 void cleanup(BeagleRTContext *context, void *userData);
andrewm@46 329
andrewm@47 330 /** @} */
andrewm@47 331
andrewm@47 332 /**
andrewm@47 333 * \defgroup control Control and command line functions
andrewm@47 334 *
andrewm@47 335 * These functions are used to initialise the BeagleRT settings, process arguments
andrewm@47 336 * from the command line, and start/stop the audio and sensor system.
andrewm@47 337 *
andrewm@47 338 * @{
andrewm@47 339 */
andrewm@47 340
andrewm@46 341 // *** Command-line settings ***
andrewm@46 342
andrewm@46 343 /**
andrewm@46 344 * \brief Initialise the data structure containing settings for BeagleRT.
andrewm@46 345 *
andrewm@46 346 * This function should be called in main() before parsing any command-line arguments. It
andrewm@46 347 * sets default values in the data structure which specifies the BeagleRT settings, including
andrewm@46 348 * frame sizes, numbers of channels, volume levels and other parameters.
andrewm@46 349 *
andrewm@46 350 * \param settings Structure holding initialisation data for BeagleRT.
andrewm@46 351 */
andrewm@46 352 void BeagleRT_defaultSettings(BeagleRTInitSettings *settings);
andrewm@46 353
andrewm@46 354 /**
andrewm@46 355 * \brief Get long options from command line argument list, including BeagleRT standard options
andrewm@46 356 *
andrewm@46 357 * This function should be used in main() to process command line options, in place of the
andrewm@46 358 * standard library getopt_long(). Internally, it parses standard BeagleRT command-line options,
andrewm@46 359 * storing the results in the settings data structure. Any options which are not part of the
andrewm@46 360 * BeagleRT standard options will be returned, as they would normally be in getopt_long().
andrewm@46 361 *
andrewm@46 362 * \param argc Number of command line options, as passed to main().
andrewm@46 363 * \param argv Array of command line options, as passed to main().
andrewm@46 364 * \param customShortOptions List of short options to be parsed, analogous to getopt_long(). This
andrewm@46 365 * list should not include any characters already parsed as part of the BeagleRT standard options.
andrewm@46 366 * \param customLongOptions List of long options to parsed, analogous to getopt_long(). This
andrewm@46 367 * list should not include any long options already parsed as part of the BeagleRT standard options.
andrewm@46 368 * \param settings Data structure holding initialisation settings for BeagleRT. Any standard options
andrewm@46 369 * parsed will automatically update this data structure.
andrewm@46 370 *
andrewm@46 371 * \return Value of the next option parsed which is not a BeagleRT standard option, or -1 when the
andrewm@46 372 * argument list has been exhausted. Similar to the return value of getopt_long() except that BeagleRT
andrewm@46 373 * standard options are handled internally and not returned.
andrewm@46 374 */
andrewm@46 375 int BeagleRT_getopt_long(int argc, char *argv[], const char *customShortOptions,
andrewm@46 376 const struct option *customLongOptions, BeagleRTInitSettings *settings);
andrewm@46 377
andrewm@46 378 /**
andrewm@46 379 * \brief Print usage information for BeagleRT standard options.
andrewm@46 380 *
andrewm@46 381 * This function should be called from your code wherever you wish to print usage information for the
andrewm@46 382 * user. It will print usage information on BeagleRT standard options, after which you can print usage
andrewm@46 383 * information for your own custom options.
andrewm@46 384 */
andrewm@46 385 void BeagleRT_usage();
andrewm@46 386
andrewm@46 387 /**
andrewm@46 388 * \brief Set level of verbose (debugging) printing.
andrewm@46 389 *
andrewm@46 390 * \param level Verbosity level of the internal BeagleRT system. 0 by default; higher values will
andrewm@46 391 * print more information. Presently all positive numbers produce the same level of printing.
andrewm@46 392 */
andrewm@46 393 void BeagleRT_setVerboseLevel(int level);
andrewm@46 394
andrewm@47 395
andrewm@46 396 // *** Audio control functions ***
andrewm@46 397
andrewm@46 398 /**
andrewm@46 399 * \brief Initialise audio and sensor rendering environment.
andrewm@46 400 *
andrewm@46 401 * This function prepares audio rendering in BeagleRT. It should be called from main() sometime
andrewm@46 402 * after command line option parsing has finished. It will initialise the rendering system, which
andrewm@56 403 * in the process will result in a call to the user-defined setup() function.
andrewm@46 404 *
andrewm@46 405 * \param settings Data structure holding system settings, including numbers of channels, frame sizes,
andrewm@46 406 * volume levels and other information.
andrewm@46 407 * \param userData An opaque pointer to a user-defined data structure which will be passed to
andrewm@56 408 * setup(), render() and cleanup(). You can use this to pass custom information
andrewm@46 409 * to the rendering functions, as an alternative to using global variables.
andrewm@46 410 *
andrewm@46 411 * \return 0 on success, or nonzero if an error occurred.
andrewm@46 412 */
andrewm@46 413 int BeagleRT_initAudio(BeagleRTInitSettings *settings, void *userData);
andrewm@46 414
andrewm@46 415 /**
andrewm@46 416 * \brief Begin processing audio and sensor data.
andrewm@46 417 *
andrewm@46 418 * This function will start the BeagleRT audio/sensor system. After this function is called, the
andrewm@46 419 * system will make periodic calls to render() until BeagleRT_stopAudio() is called.
andrewm@46 420 *
andrewm@46 421 * \return 0 on success, or nonzero if an error occurred.
andrewm@46 422 */
andrewm@46 423 int BeagleRT_startAudio();
andrewm@46 424
andrewm@46 425 /**
andrewm@46 426 * \brief Stop processing audio and sensor data.
andrewm@46 427 *
andrewm@46 428 * This function will stop the BeagleRT audio/sensor system. After this function returns, no further
andrewm@46 429 * calls to render() will be issued.
andrewm@46 430 */
andrewm@46 431 void BeagleRT_stopAudio();
andrewm@46 432
andrewm@46 433 /**
andrewm@46 434 * \brief Clean up resources from audio and sensor processing.
andrewm@46 435 *
andrewm@46 436 * This function should only be called after BeagleRT_stopAudio(). It will release any
andrewm@46 437 * internal resources for audio and sensor processing. In the process, it will call the
andrewm@56 438 * user-defined cleanup() function.
andrewm@46 439 */
andrewm@46 440 void BeagleRT_cleanupAudio();
andrewm@46 441
andrewm@47 442 /** @} */
andrewm@47 443
andrewm@47 444 /**
andrewm@47 445 * \defgroup levels Audio level controls
andrewm@47 446 *
andrewm@47 447 * These functions control the input and output levels for the audio codec. If a BeagleRT program
andrewm@47 448 * does not call these functions, sensible default levels will be used.
andrewm@47 449 *
andrewm@47 450 * @{
andrewm@47 451 */
andrewm@46 452
andrewm@46 453 // *** Volume and level controls ***
andrewm@46 454
andrewm@46 455 /**
andrewm@46 456 * \brief Set the level of the audio DAC.
andrewm@46 457 *
andrewm@46 458 * This function sets the level of all audio outputs (headphone, line, speaker). It does
andrewm@46 459 * not affect the level of the (non-audio) analog outputs.
andrewm@46 460 *
andrewm@46 461 * \b Important: do not call this function from within render(), as it does not make
andrewm@46 462 * any guarantees on real-time performance.
andrewm@46 463 *
andrewm@46 464 * \param decibels Level of the DAC output. Valid levels range from -63.5 (lowest) to
andrewm@46 465 * 0 (highest) in steps of 0.5dB. Levels between increments of 0.5 will be rounded down.
andrewm@46 466 *
andrewm@46 467 * \return 0 on success, or nonzero if an error occurred.
andrewm@46 468 */
andrewm@46 469 int BeagleRT_setDACLevel(float decibels);
andrewm@46 470
andrewm@46 471 /**
andrewm@46 472 * \brief Set the level of the audio ADC.
andrewm@46 473 *
andrewm@46 474 * This function sets the level of the audio input. It does not affect the level of the
andrewm@46 475 * (non-audio) analog inputs.
andrewm@46 476 *
andrewm@46 477 * \b Important: do not call this function from within render(), as it does not make
andrewm@46 478 * any guarantees on real-time performance.
andrewm@46 479 *
andrewm@46 480 * \param decibels Level of the ADC input. Valid levels range from -12 (lowest) to
andrewm@46 481 * 0 (highest) in steps of 1.5dB. Levels between increments of 1.5 will be rounded down.
andrewm@46 482 *
andrewm@46 483 * \return 0 on success, or nonzero if an error occurred.
andrewm@46 484 */
andrewm@46 485 int BeagleRT_setADCLevel(float decibels);
andrewm@46 486
andrewm@46 487 /**
andrewm@46 488 * \brief Set the level of the onboard headphone amplifier.
andrewm@46 489 *
andrewm@46 490 * This function sets the level of the headphone output only (3-pin connector on the BeagleRT
andrewm@46 491 * cape or the output jack on the BeagleBone Audio Cape). It does not affect the level of the
andrewm@46 492 * speakers or the line out pads on the cape.
andrewm@46 493 *
andrewm@46 494 * \b Important: do not call this function from within render(), as it does not make
andrewm@46 495 * any guarantees on real-time performance.
andrewm@46 496 *
andrewm@46 497 * \param decibels Level of the DAC output. Valid levels range from -63.5 (lowest) to
andrewm@46 498 * 0 (highest) in steps of 0.5dB. Levels between increments of 0.5 will be rounded down.
andrewm@46 499 *
andrewm@46 500 * \return 0 on success, or nonzero if an error occurred.
andrewm@46 501 */
andrewm@46 502 int BeagleRT_setHeadphoneLevel(float decibels);
andrewm@46 503
andrewm@46 504 /**
andrewm@46 505 * \brief Mute or unmute the onboard speaker amplifiers.
andrewm@46 506 *
andrewm@46 507 * This function mutes or unmutes the amplifiers on the BeagleRT cape. Whether the speakers begin
andrewm@46 508 * muted or unmuted depends on the BeagleRTInitSettings structure passed to BeagleRT_initAudio().
andrewm@46 509 *
andrewm@46 510 * \b Important: do not call this function from within render(), as it does not make
andrewm@46 511 * any guarantees on real-time performance.
andrewm@46 512 *
andrewm@46 513 * \param mute 0 to enable the speakers, nonzero to mute the speakers.
andrewm@46 514 *
andrewm@46 515 * \return 0 on success, or nonzero if an error occurred.
andrewm@46 516 */
andrewm@46 517 int BeagleRT_muteSpeakers(int mute);
andrewm@46 518
andrewm@47 519 /** @} */
andrewm@47 520
andrewm@47 521 /**
andrewm@47 522 * \defgroup auxtask Auxiliary task support
andrewm@47 523 *
andrewm@47 524 * These functions are used to create separate real-time tasks (threads) which run at lower
andrewm@47 525 * priority than the audio processing. They can be used, for example, for large time-consuming
andrewm@47 526 * calculations which would take more than one audio frame length to process, or they could be
andrewm@47 527 * used to communicate with external hardware when that communication might block or be delayed.
andrewm@47 528 *
andrewm@56 529 * All auxiliary tasks used by the program should be created in setup(). The tasks
andrewm@47 530 * can then be scheduled at will within the render() function.
andrewm@47 531 *
andrewm@47 532 * @{
andrewm@47 533 */
andrewm@47 534
andrewm@46 535 // *** Functions for creating auxiliary tasks ***
andrewm@46 536
andrewm@46 537 /**
andrewm@46 538 * \brief Create a new auxiliary task.
andrewm@46 539 *
andrewm@46 540 * This function creates a new auxiliary task which, when scheduled, runs the function specified
andrewm@46 541 * in the first argument. Note that the task does not run until scheduleAuxiliaryTask() is called.
andrewm@56 542 * Auxiliary tasks should be created in setup() and never in render() itself.
andrewm@46 543 *
andrewm@46 544 * The second argument specifies the real-time priority. Valid values are between 0
andrewm@47 545 * and 99, and usually should be lower than \ref BEAGLERT_AUDIO_PRIORITY. Tasks with higher priority always
andrewm@46 546 * preempt tasks with lower priority.
andrewm@46 547 *
andrewm@46 548 * \param functionToCall Function which will run each time the auxiliary task is scheduled.
andrewm@46 549 * \param priority Xenomai priority level at which the task should run.
andrewm@47 550 * \param name Name for this task, which should be unique system-wide (no other running program should use this name).
andrewm@46 551 */
andrewm@47 552 AuxiliaryTask BeagleRT_createAuxiliaryTask(void (*functionToCall)(void), int priority, const char *name);
andrewm@46 553
andrewm@46 554 /**
andrewm@46 555 * \brief Run an auxiliary task which has previously been created.
andrewm@46 556 *
andrewm@46 557 * This function will schedule an auxiliary task to run. When the task runs, the function in the first
andrewm@46 558 * argument of createAuxiliaryTaskLoop() will be called.
andrewm@46 559 *
andrewm@46 560 * scheduleAuxiliaryTask() is typically called from render() to start a lower-priority task. The function
andrewm@46 561 * will not run immediately, but only once any active higher priority tasks have finished.
andrewm@46 562 *
andrewm@46 563 * \param task Task to schedule for running.
andrewm@46 564 */
andrewm@47 565 void BeagleRT_scheduleAuxiliaryTask(AuxiliaryTask task);
andrewm@47 566
andrewm@47 567 /** @} */
andrewm@46 568
andrewm@46 569 #endif /* BEAGLERT_H_ */