/usr/include/sipxtapi/mp/MpInputDeviceManager.h is in libsipxtapi-dev 3.3.0~test17-1.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 | //
// Copyright (C) 2007-2008 SIPez LLC.
// Licensed to SIPfoundry under a Contributor Agreement.
//
// Copyright (C) 2007-2008 SIPfoundry Inc.
// Licensed by SIPfoundry under the LGPL license.
//
// $$
///////////////////////////////////////////////////////////////////////////////
// Author: Dan Petrie <dpetrie AT SIPez DOT com>
#ifndef _MpInputDeviceManager_h_
#define _MpInputDeviceManager_h_
// SYSTEM INCLUDES
// APPLICATION INCLUDES
#include <os/OsRWMutex.h>
#include <utl/UtlHashMap.h>
#include <utl/UtlHashBag.h>
#include "mp/MpTypes.h"
// DEFINES
// MACROS
// EXTERNAL FUNCTIONS
// EXTERNAL VARIABLES
// CONSTANTS
// STRUCTS
// TYPEDEFS
// FORWARD DECLARATIONS
class MpInputDeviceDriver;
class UtlString;
class MpBufPtr;
class MpBufPool;
/**
* @brief Container of input devices for input drivers and resources.
*
* The MpInputDeviceManager is a container of input device drivers and provides
* the media frame collector and accessor for MprFromInputDevice resources.
* MpInputDeviceDriver instances are added to the MpInputDeviceManager and
* removed from it by external entities, using addDevice() and removeDevice().
* Enabled MpInputDeviceDrivers push frames of media on to the connection
* indicated by the device ID. The MpInputDeviceManager queues the media
* frames to be accessible by MprFromInputDevice resources via the getFrame
* method. The specific device driver is accessed by the device ID or handle.
* The MpInputDeviceManager maintains a device ID to device name
* mapping. All device IDs and device names are unique within the
* scope of this MpInputDeviceManager. The device ID provides a level of
* indirection that allows the MpInputDeviceManager to protect against access of
* transient devices.
*
* MpInputDeviceManager allows multiple MprFromInputDevice resources to
* read a frame of media via the getFrame method. Each resource gets its
* own copy of an MpBuf.
*
* MpInputDeviceDrivers invoke the pushFrame method to provide frames of
* media for a specific device ID. The MpInputDeviceManager maintains
* a simple queue of frames for a short window of time. It is the
* MprFromInputDevice resource's (or other consumer invoking getFrame)
* responsibility to decide how far behind (buffer latency) the current frame
* to maintain within the configured window of frames buffered.
*
* The MpInputDeviceManager uses MpAudioInputConnection internally to
* map the association between MpInputDeviceDrivers and device ID. The
* MpAudioInputConnection also maintains the buffered media frames for a
* device for a configured window of time.
*
* @NOTE This class is intensionally NOT a singleton so that multiple
* instances can be created in support of multiple instances of the media
* subsystem being created. Multiple instances may be useful for taking
* advantage of multi-processors, testing and other interesting applications.
*/
class MpInputDeviceManager
{
/* //////////////////////////// PUBLIC //////////////////////////////////// */
public:
/* ============================ CREATORS ================================== */
///@name Creators
//@{
/// @brief Default constructor
MpInputDeviceManager(unsigned defaultSamplesPerFrame,
unsigned defaultSamplesPerSecond,
unsigned defaultNumBufferedFrames,
MpBufPool& bufferPool);
/**<
* @param defaultSamplesPerFrame - (in) the default number of samples in
* a frame of media to be used when enabling devices.
* @param defaultSamplesPerSecond - (in) default sample rate for media frame
* in samples per second to be used when enabling devices.
* @param defaultNumBufferedFrames - (in) default number of frames to
* buffer for a device before releasing the frame. Consumers of
* frames (callers of getFrame) have the window of time to retrieve
* any of the frames buffered.
* @param bufferPool - pool from which buffers are obtained for media
* data space
*/
/// @brief Destructor
virtual
~MpInputDeviceManager();
/**<
* @NOTE This is NOT thread safe. The invoker of this destructor
* MUST be sure that no device drivers or resources are referencing
* this device manager.
*/
//@}
/* ============================ MANIPULATORS ============================== */
///@name Manipulators
//@{
/// @brief Add a new input device for use
MpInputDeviceHandle addDevice(MpInputDeviceDriver& newDevice);
/**<
* Returns device ID which is unique within this device manager.
* This method locks the device manager for exclusive use.
*
* @param newDevice - (in) A new input device to add to this manager.
* The device should <b>only</b> be added to one manager.
* @returns A handle to reference the device by in other manager calls.
*
* Multi-thread safe.
*/
/// @brief Remove an existing input device
MpInputDeviceDriver* removeDevice(MpInputDeviceHandle deviceId);
/**<
* This method locks the device manager for exclusive use.
*
* @param deviceId - (in) The device to disable.
* @returns A pointer to the input device driver that was removed.
* @returns NULL if the device could not be found or device is busy.
*
* Multi-thread safe.
*/
/// @brief Set device parameters before enabling it.
OsStatus setupDevice(MpInputDeviceHandle deviceId,
uint32_t samplesPerFrame = 0,
uint32_t samplesPerSec = 0);
/**<
* Use this method if you want to set parameters different from the manager
* defaults. If you're happy with the manager defaults, you may omit this.
*
* @param[in] deviceId - (in) The device to setup.
* @param[in] samplesPerFrame (optional) - The samples per frame that this
* device should operate with. If not specified, the manager's
* default will be used.
* @param[in] samplesPerSec (optional) - The sample rate that this device
* should operate at. If not specified, the manager's default will
* be used.
* @returns OS_NOT_FOUND if the device could not be found.
*
* @NOTE This SHOULD NOT be used to mute/unmute a device. Disabling and
* enabling a device results in state and buffer queues being cleared.
*
* Multi-thread safe.
*/
/// @brief Helper to enable device driver
OsStatus enableDevice(MpInputDeviceHandle deviceId);
/**<
* This method enables the device driver indicated by the device id.
*
* @param[in] deviceId - The device to enable.
* @returns OS_NOT_FOUND if the device could not be found.
*
* @NOTE This SHOULD NOT be used to mute/unmute a device. Disabling and
* enabling a device results in state and buffer queues being cleared.
*
* Multi-thread safe.
*/
/// @brief Helper to disable device driver
OsStatus disableDevice(MpInputDeviceHandle deviceId);
/**<
* This method disables the device driver indicated by the device id.
*
* @param[in] deviceId - The device to disable.
* @returns OS_NOT_FOUND if the device could not be found.
* @returns OS_BUSY if the device is currently being removed or disabled.
*
* @NOTE This SHOULD NOT be used to mute/unmute a device. Disabling and
* enabling a device results in state and buffer queues being cleared.
*
* Multi-thread safe.
*/
/// @brief Method for MpInputDeviceDriver to push a frame of media for a given time
OsStatus pushFrame(MpInputDeviceHandle deviceId,
unsigned numSamples,
MpAudioSample *samples,
MpFrameTime frameTime);
/**<
* This method is used to push a frame to the MpInputDeviceManager to be
* buffered for a short window of time during which consumers such as
* MpFromInputDevice can retrieve the frame via the getFrame method.
*
* @param deviceId - (in) device id to identify from which device the
* frame is from.
* @param numSamples - (in) number of samples in the frame of media from
* the device. This must be the frame size number of samples that
* the device is configure to provide.
* @param samples - (in) the actual media for the frame.
* @param frameTime - (in) time in milliseconds for beginning of frame
* relative to the MpInputDeviceManager reference time.
* @returns OS_NOT_FOUND if the device could not be found.
*
* Multi-thread safe.
*/
/// @brief Method for obtaining the buffer for a given frame and device ID
OsStatus getFrame(MpInputDeviceHandle deviceId,
MpFrameTime &frameTime,
MpBufPtr& buffer,
unsigned& numFramesBefore,
unsigned& numFramesAfter);
/**<
* Method for obtaining the buffer for a given frame and device ID
* This method is typically invoked by MprFromInputDevice resources.
*
* @param deviceId - (in) device id to identify from which device a frame
* is to be retrieved.
* @param frameTime - (in/out) time in milliseconds for beginning of frame
* relative to the MpInputDeviceManager reference time. If frame
* successfully pulled, this param would be set to frame time of
* this frame. You may use this value to synchronize to device
* driver.
* @param buffer - (out) frame of media to be retrieved (copied for
* callers context).
* @param numFramesBefore - (out) number of frames buffered which are
* newer than the frame for the requested time.
* @param numFramesAfter - (out) number of frames buffered which are older
* than the frame for the requested time.
*
* @returns OS_INVALID_ARGUMENT if the device id does not exist.
* @returns OS_INVALID_STATE if the frame for the requested time is not
* available yet and the device is not enabled.
* @returns OS_NOT_FOUND if the frame for the requested time is not
* available yet.
*
* Multi-thread safe.
*/
//@}
/* ============================ ACCESSORS ================================= */
///@name Accessors
//@{
/// @brief Get the device driver name for the given device ID
OsStatus getDeviceName(MpInputDeviceHandle deviceId, UtlString& deviceName) const;
/**<
* Get the name for the given deviceId.
*
* @param deviceId - (in) The device to fetch the name of.
* @param deviceName - (out) a UtlString that will hold the deviceName
* @returns OS_SUCCESS and <tt>deviceName</tt> filled with the
* name of the device.
* @returns OS_NOT_FOUND if the device could not be found.
*
* Multi-thread safe.
*/
/// @brief Get the device id for the given device driver name
OsStatus getDeviceId(const UtlString& deviceName,
MpInputDeviceHandle& deviceId) const;
/**<
* The MpInputDeviceManager maintains a device ID to device name
* mapping. All device IDs and device names are unique within the
* scope of this MpInputDeviceManager.
*
* @param deviceName - (in) The name of a device to get the ID of.
* @param deviceId - (out) A place to store the ID of the device.
* @returns OS_SUCCESS and \c deviceId set with the ID of the
* device, if the device was found.
* @returns OS_NOT_FOUND and \c deviceId set with -1 if the
* device could not be found.
*
* Multi-thread safe.
*/
/// @brief Get current frame timestamp
MpFrameTime getCurrentFrameTime(MpInputDeviceHandle deviceId) const;
/**<
* The timestamp is in milliseconds from the initial reference point
* in time for this device.
*
* @param[in] deviceId - A place to store the ID of the device.
*
* @NOTE This number will wrap roughly every 49.7 days.
*
* Multi-thread safe.
*/
/// @brief Get the sample rate that a particular device is running at.
OsStatus getDeviceSamplesPerSec(MpInputDeviceHandle deviceId,
uint32_t& samplesPerSec) const;
/**<
* @param[in] deviceId - The ID of the device to query.
* @param[out] samplesPerSec - Filled with the indicated device's
* sample rate if OS_SUCCESS is returned.
* @retval OS_NOT_FOUND if device was not able to be found.
* @retval OS_SUCCESS if device was able to be found and sample rate was
* looked up.
*/
/// @brief Get the number of samples per frame that a particular device is running at.
OsStatus getDeviceSamplesPerFrame(MpInputDeviceHandle deviceId,
uint32_t& samplesPerFrame) const;
/**<
* @param[in] deviceId - The ID of the device to query.
* @param[out] samplesPerFrame - Filled with the indicated device's
* number of samples per frame if OS_SUCCESS is returned.
* @retval OS_NOT_FOUND if device was not able to be found.
* @retval OS_SUCCESS if device was able to be found and number of
* samples per frame was looked up.
*/
/// @brief Method for obtaining the time derivatives for sequential frames
/// @brief as relates to reference time.
OsStatus getTimeDerivatives(MpInputDeviceHandle deviceId,
unsigned& nDerivatives,
double*& derivativeBuf) const;
/**<
* Calculates the derivative:
* <tt>(t2-t1)/(reference frame period) for sequential t1,t2</tt>
* for each set of times buffered, starting from the most recent
* in the buffer.
*
* @param deviceId - (in) device to get statistics for.
* @param nDerivatives - (in/out) number of derivatives to attempt to obtain.
* @param derivativeBuf - (out) an allocated buffer of at least size
* \cnDerivatives which will be filled with the derivatives.
*
* @returns \cnDerivatives contains the number of derivatives calculated
* and returned. If there are less than \cnDerivatives frames
* buffered, then the number of derivatives calculated and
* returned is the number of frames buffered.
* @returns OS_INVALID_ARGUMENT if the device id does not exist.
*
* Multi-thread safe.
*/
//@}
/* ============================ INQUIRY =================================== */
///@name Inquiry
//@{
/// @brief Inquire if device is enabled (e.g. generating media data).
UtlBoolean isDeviceEnabled(MpInputDeviceHandle deviceId) const;
/**<
* Inquire if device is enabled (e.g. generating media data).
*
* @param deviceId - (in) The device to determine enabled status of.
*/
//@}
/* //////////////////////////// PROTECTED ///////////////////////////////// */
protected:
/* //////////////////////////// PRIVATE /////////////////////////////////// */
private:
mutable OsRWMutex mRwMutex;
MpInputDeviceHandle mLastDeviceId;
unsigned mDefaultSamplesPerFrame;
unsigned mDefaultSamplesPerSecond;
unsigned mDefaultNumBufferedFrames;
MpBufPool* mpBufferPool;
UtlHashMap mConnectionsByDeviceName;
UtlHashBag mConnectionsByDeviceId;
OsTime mTimeZero;
/// Copy constructor (not implemented for this class)
MpInputDeviceManager(const MpInputDeviceManager& rMpInputDeviceManager);
/// Assignment operator (not implemented for this class)
MpInputDeviceManager& operator=(const MpInputDeviceManager& rhs);
};
/* ============================ INLINE METHODS ============================ */
#endif // _MpInputDeviceManager_h_
|