zmf_audio.h 13.4 KB
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 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464
#ifndef __ZMF_AUDIO_H__
#define __ZMF_AUDIO_H__

/**
 * @file zmf_audio.h
 * @brief ZMF audio interfaces
 */

#ifdef __cplusplus
extern "C" {
#endif

/**
 * @brief Initialize Audio module of ZMF(Zero Media Framework).
 * @param  applicationContext For Windows, it can be the handle of the window,
 *                            The notification event will be sent to that window.
 *                            Or it can be callback function of type ZmfEventListenCallback.
 *                            For Android, it must be the Context.
 *                            For iOS, it should be NULL and is ignored.
 * @return                    0 on succeed, otherwise failed.
 */
int Zmf_AudioInitialize(void *applicationContext);

/**
 * @brief Destory Audio module of ZMF module. All resources will be released.
 * @return  0 on succeed, otherwise failed.
 */
int Zmf_AudioTerminate (void);

/**
 * @brief Set log print level, default is 0(debug level)
 * @param[in] level  [0-4] debug, info, warn, error, silent
 */
void Zmf_LogSetLevel (int level);

#ifdef __cplusplus
}
#endif /* __cplusplus */

/**
 * @brief AEC mode.
 */
typedef enum {
    ZmfAecAuto                          = -1, /**< @brief Auto select mode. */
    ZmfAecOff                           = 0, /**< @brief Disable AEC. */
    ZmfAecOn                            = 1, /**< @brief Enable AEC. */
} ZmfAecMode;

/**
 * @brief AGC mode.
 */
typedef enum {
    ZmfAgcAuto                          = -1, /**< @brief Auto select mode. */
    ZmfAgcOff                           = 0, /**< @brief Disable AGC. */
    ZmfAgcOn                            = 1, /**< @brief Enable AGC. */
} ZmfAgcMode;

/**
 * @brief Session Mode.
 */
typedef enum {
    ZmfSessionAutoMode                  = 0, /**< @brief Auto select mode, i.e. do nothing. */
    ZmfSessionDefault                   = 1, /**< @brief Default mode. if not support, do nothing */
    ZmfSessionVoiceChat                 = 2, /**< @brief Voice mode, if not support, set Default mode */
    ZmfSessionVideoChat                 = 3, /**< @brief Video mode, if not support, set Default mode */
} ZmfSessionMode;

#ifdef __OBJC__

#import <UIKit/UIKit.h>

/**
 * @defgroup ZmfAudioDeviceId Audio Device ID
 * @{
 */

/** @brief Device ID string of Remote IO. */
extern const char * const ZmfAudioDeviceRemote;

/** @brief Device ID string of Voice Processing IO. */
extern const char * const ZmfAudioDeviceVoice;

/**
 * @}
 */

/**
 * @defgroup ZmfAudioNotificationParameters Audio Notification Parameters.
 * @{
 */

/**
 * @brief An NSString object containing a string that identifies
 * audio input device ID.
 */
extern NSString * const ZmfAudioInput;

/**
 * @brief An NSString object containing a string that identifies
 * audio output device ID.
 */
extern NSString * const ZmfAudioOutput;

/**
 * @brief An NSNumber object containing an integer that identifies
 * the samping rate in Hz.
 */
extern NSString * const ZmfSamplingRate;

/**
 * @brief An NSNumber object containing an integer that identifies
 * the channel number.
 */
extern NSString * const ZmfChannelNumber;

/**
 * @brief An NSNumber object containing an integer that identifies
 * the request type for Automatic Gain Control(AGC).
 * For a list of possible values, @ref ZmfAgcMode.
 */
extern NSString * const ZmfAutoGainControl;

/**
 * @brief An NSNumber object containing an integer that identifies
 * the request type for Acoustic Echo Cancellation(AEC).
 * For a list of possible values, @ref ZmfAecMode.
 */
extern NSString * const ZmfAcousticEchoCancel;

/**
 * @brief An NSString object containing a string that identifies
 * the reason of error.
 */
extern NSString * const ZmfAudioError;

/**
 * @}
 */

/**
 * @defgroup ZmfAudioNotifications Audio Notifications.
 * @{
 */

/**
 * @brief Post when the ZMF module request to start recording audio data.
 *
 * The userInfo dictionary of this notification contains @ref ZmfAudioInput,
 * @ref ZmfSamplingRate and @ref ZmfChannelNumber, which provide detail 
 * information for the request.
 */
extern NSString * const ZmfAudioInputRequestStart;

/**
 * @brief Post when the ZMF module request to stop recording audio data.
 *
 * The userInfo dictionary of this notification contains @ref ZmfAudioInput,
 * which provide detail information for the request.
 */
extern NSString * const ZmfAudioInputRequestStop;

/**
 * @brief Post when the ZMF module has received first audio input data after
 * @ref Zmf_AudioInputStart is invoked.
 *
 * The userInfo dictionary of this notification contains @ref ZmfAudioInput,
 * @ref ZmfSamplingRate and @ref ZmfChannelNumber, which indicate the actual
 * parameters of the audio data recorded.
 */
extern NSString * const ZmfAudioInputDidStart;

/**
 * @brief Post when the ZMF module request to start playing audio data.
 *
 * The userInfo dictionary of this notification contains @ref ZmfAudioOutput,
 * @ref ZmfSamplingRate and @ref ZmfChannelNumber, which provide detail 
 * information for the request.
 */
extern NSString * const ZmfAudioOutputRequestStart;

/**
 * @brief Post when the ZMF module request to stop playing audio data.
 *
 * The userInfo dictionary of this notification contains @ref ZmfAudioOutput,
 * which provide detail information for the request.
 */
extern NSString * const ZmfAudioOutputRequestStop;

/**
 * @brief Post when the ZMF module has delivered first audio output data after
 * @ref Zmf_AudioOutputStart is invoked.
 *
 * The userInfo dictionary of this notification contains @ref ZmfAudioOutput,
 * @ref ZmfSamplingRate and @ref ZmfChannelNumber, which indicate the actual
 * parameters of the audio data.
 */
extern NSString * const ZmfAudioOutputDidStart;

/**
 * @brief Post when the ZMF Audio module has received an interruption during working,
 * and then enter into an interrupted status.
 *
 * The ZMF Audio module will stop working (input/output) automatically.
 */
extern NSString * const ZmfAudioInterrupted;

/** 
 * @brief Post when the ZMF Audio module has received a 'should resume' message
 * at the interrupted status.
 *
 * The ZMF Audio module will restore working (input/output) automatically.
 */
extern NSString * const ZmfAudioDidResume;

/** @brief Post when the ZMF Audio module has an error occurred.
 *
 * The userInfo dictionary of this notification contains @ref ZmfAudioError
 */
extern NSString * const ZmfAudioErrorOccurred;

/**
 * @}
 */

#endif /* __OBJC__ */

#ifdef _WIN32

/**
 * @brief Event number for audio notifications.
 *
 * The wParam of the event is the type of notification.
 * For a list of possible values, @ref ZmfAudioEventType.
 *
 * The lParam of the event may contain a JSON object which depends on the
 * type of notification.
 */
#define ZmfAudioEvent           WM_APP + 130

/**
 * @defgroup ZmfNotificationParameters Audio Notification Parameters.
 * @{
 */

/**
 * @brief A String object containing a string that identifies
 * ID of audio input device.
 */
#define ZmfAudioInput           "AudioInput"

/**
* @brief A String object containing a string that identifies
* ID of audio output device.
*/
#define ZmfAudioOutput          "AudioOutput"

/**
 * @brief A Number object containing an integer that identifies
 * the samping rate in Hz.
 */
#define ZmfSamplingRate         "SamplingRate"

/**
 * @brief A Number object containing an integer that identifies
 * the channel number.
 */
#define ZmfChannelNumber        "ChannelNumber"

/**
 * @brief A Number object containing an integer that identifies
 * the request type for Automatic Gain Control(AGC).
 * For a list of possible values, @ref ZmfAgcMode.
 */
#define ZmfAutoGainControl      "AutoGainControl"

/**
 * @brief A Number object containing a integer that identifies
 * the request type for Acoustic Echo Cancellation(AEC).
 * For a list of possible values, @ref ZmfAecMode.
 */
#define ZmfAcousticEchoCancel   "AcousticEchoCancel"

/**
 * @brief A String object containing a string that describes error reason.
 * the format match 'input <id>|output <id>|audio: <reason>'.
 */
#define ZmfAudioError           "AudioError"

/**
 * @}
 */

/**
 * @brief Type of audio notifications.
 */
typedef enum {
    /**
     * @brief Post when the ZMF module request to start recording audio data.
     *
     * The lParam of this event is a JSON object contains @ref ZmfAudioInput,
     * @ref ZmfSamplingRate and @ref ZmfChannelNumber, which provide detail 
     * information for the request.
     */
    ZmfAudioInputRequestStart           = 1,

    /**
     * @brief Post when the ZMF module request to stop recording audio data.
     *
     * The lParam of this event is a JSON object contains @ref ZmfAudioInput,
     * which provide detail information for the request.
     */
    ZmfAudioInputRequestStop            = 2,

    /**
     * @brief Post when the ZMF module has received first audio input data after
     * @ref Zmf_AudioInputStart is invoked.
     *
     * The lParam of this event is a JSON object contains @ref ZmfAudioInput,
     * @ref ZmfSamplingRate and @ref ZmfChannelNumber, which indicate the actual
     * parameters of the audio data recorded.
     */
    ZmfAudioInputDidStart               = 3,

    /**
     * @brief Post when the ZMF module request to start playing audio data.
     *
     * The lParam of this event is a JSON object contains @ref ZmfAudioOutput,
     * @ref ZmfSamplingRate and @ref ZmfChannelNumber, which provide detail 
     * information for the request.
     */
    ZmfAudioOutputRequestStart          = 4,

    /**
     * @brief Post when the ZMF module request to stop playing audio data.
     *
     * The userInfo dictionary of this notification contains @ref ZmfAudioOutput,
     * which provide detail information for the request.
     */
    ZmfAudioOutputRequestStop           = 5,

    /**
     * @brief Post when the ZMF module has delivered first audio output data after
     * @ref Zmf_AudioOutputStart is invoked.
     *
     * The lParam of this event is a JSON object contains @ref ZmfAudioOutput,
     * @ref ZmfSamplingRate and @ref ZmfChannelNumber, which indicate the actual
     * parameters of the audio data.
     */
    ZmfAudioOutputDidStart              = 6,

    /** @brief Post when the ZMF Audio module has an error occurred.
     *
     * The lParam of this event is a JSON object contains @ref ZmfAudioError
     */
    ZmfAudioErrorOccurred               = 7,
} ZmfAudioEventType;

#endif /* _WIN32 */

#ifdef __cplusplus
extern "C" {
#endif

/**
 * @brief Set audio session mode
 * @return        0 on succeed, otherwise failed.
 */
int Zmf_AudioSessionSetMode (ZmfSessionMode enAudioMode);

/**
 * @brief Get count of audio input devices.
 * @return  The total count of audio input devices.
 */
int Zmf_AudioInputGetCount (void);

/**
 * @brief Set volume of audio input device, only supported on Windows
 *
 * @return          0 on succeed, otherwise failed.
 */
int Zmf_AudioInputSetVolume(int percent);

/**
 * @brief Get the name of audio input device.
 * @param  iIndex   The index of audio input device, from 0 to count - 1.
 * @param  acId     Pointer the buffer contains ID string.
 * @param  acName   Pointer the buffer contains utf8 name string.
 * @return          0 on succeed, otherwise failed.
 */
int Zmf_AudioInputGetName (int iIndex, char acId[512], char acName[512]);

/**
 * @brief Start audio input device to record data.
 * @param  pcId           The ID of audio input device.
 * @param  iSamplingRate  Sampling rate in Hz, 0 for auto selection.
 * @param  iChannelNumber Channel number, 0 for auto selection.
 * @param  enAecMode      AEC mode @ref ZmfAecMode.
 * @param  enAgcMode      AGC mode @ref ZmfAgcMode.
 * @return                0 on succeed, otherwise failed.
 */
int Zmf_AudioInputStart (const char* pcId, int iSamplingRate, int iChannelNumber,
                         ZmfAecMode enAecMode, ZmfAgcMode enAgcMode);

/**
 * @brief Stop audio input device.
 * @param  pcId  The ID of audio input device.
 * @return       0 on succeed, otherwise failed.
 */
int Zmf_AudioInputStop (const char* pcId);

/**
 * @brief Stop all audio input devices.
 * @return  0 on succeed, otherwise failed.
 */
int Zmf_AudioInputStopAll (void);

/**
 * @brief Get count of audio output devices.
 * @return  The total count of audio output devices.
 */
int Zmf_AudioOutputGetCount (void);

/**
 * @brief Set volume of audio output device, only supported on Windows
 *
 * @return          0 on succeed, otherwise failed.
 */
int Zmf_AudioOutputSetVolume(int percent);
/**
 * @brief Get the name of audio output device.
 * @param  iIndex   The index of audio output device, from 0 to count - 1.
 * @param  acId     Pointer the buffer contains ID string.
 * @param  acName   Pointer the buffer contains name utf8 string.
 * @return          0 on succeed, otherwise failed.
 */
int Zmf_AudioOutputGetName (int iIndex, char acId[512], char acName[512]);

/**
 * @brief Start audio output device to play data.
 * @param  pcId           The ID of audio output device.
 * @param  iSamplingRate  Sampling rate in Hz, 0 for auto selection.
 * @param  iChannelNumber Channel number, 0 for auto selection.
 * @return                0 on succeed, otherwise failed.
 */
int Zmf_AudioOutputStart (const char* pcId, int iSamplingRate, int iChannelNumber);

/**
 * @brief Stop audio output device.
 * @param  pcId The ID of audio output device.
 * @return      0 on succeed, otherwise failed.
 */
int Zmf_AudioOutputStop (const char* pcId);

/**
 * @brief Stop all audio output devices.
 * @return  0 on succeed, otherwise failed.
 */
int Zmf_AudioOutputStopAll (void);

#ifdef __cplusplus
}
#endif /* __cplusplus */

#endif /* __ZMF_AUDIO_H__ */