annotate include/BeagleRT.h @ 47:643cbee74eda newapi

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