mssndcard.h 14.2 KB
Newer Older
aymeric's avatar
aymeric committed
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
/*
mediastreamer2 library - modular sound and video processing and streaming
Copyright (C) 2006  Simon MORLAT (simon.morlat@linphone.org)

This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
as published by the Free Software Foundation; either version 2
of the License, or (at your option) any later version.

This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU General Public License for more details.

You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
*/

#ifndef sndcard_h
#define sndcard_h

Simon Morlat's avatar
Simon Morlat committed
23
#include <mediastreamer2/mscommon.h>
24
#include <mediastreamer2/msfactory.h>
aymeric's avatar
aymeric committed
25 26 27 28 29 30 31 32 33 34
/**
 * @file mssndcard.h
 * @brief mediastreamer2 mssndcard.h include file
 *
 * This file provide the API needed to manage
 * soundcard filters.
 *
 */

/**
35
 * @addtogroup mediastreamer2_soundcard
aymeric's avatar
aymeric committed
36 37 38 39
 * @{
 */

struct _MSSndCardManager{
40
	MSFactory* factory;
aymeric's avatar
aymeric committed
41
	MSList *cards;
42
	MSList *descs;
aymeric's avatar
aymeric committed
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
};

/**
 * Structure for sound card manager object.
 * @var MSSndCardManager
 */
typedef struct _MSSndCardManager MSSndCardManager;

enum _MSSndCardMixerElem{
	MS_SND_CARD_MASTER,
	MS_SND_CARD_PLAYBACK,
	MS_SND_CARD_CAPTURE
};

/**
 * Structure for sound card mixer values.
 * @var MSSndCardMixerElem
 */
typedef enum _MSSndCardMixerElem MSSndCardMixerElem;

enum _MSSndCardCapture {
	MS_SND_CARD_MIC,
	MS_SND_CARD_LINE
};

68
/**
aymeric's avatar
aymeric committed
69 70
 * Structure for sound card capture source values.
 * @var MSSndCardCapture
71
 */
aymeric's avatar
aymeric committed
72
typedef enum _MSSndCardCapture MSSndCardCapture;
73 74 75 76 77 78 79

enum _MSSndCardControlElem {
	MS_SND_CARD_MASTER_MUTE,
	MS_SND_CARD_PLAYBACK_MUTE,
	MS_SND_CARD_CAPTURE_MUTE
};

aymeric's avatar
aymeric committed
80
/**
aymeric's avatar
aymeric committed
81 82
 * Structure for sound card mixer values.
 * @var MSSndCardControlElem
aymeric's avatar
aymeric committed
83
 */
aymeric's avatar
aymeric committed
84
typedef enum _MSSndCardControlElem MSSndCardControlElem;
aymeric's avatar
aymeric committed
85 86 87 88 89 90 91 92 93

struct _MSSndCard;

typedef void (*MSSndCardDetectFunc)(MSSndCardManager *obj);
typedef void (*MSSndCardInitFunc)(struct _MSSndCard *obj);
typedef void (*MSSndCardUninitFunc)(struct _MSSndCard *obj);
typedef void (*MSSndCardSetLevelFunc)(struct _MSSndCard *obj, MSSndCardMixerElem e, int percent);
typedef void (*MSSndCardSetCaptureFunc)(struct _MSSndCard *obj, MSSndCardCapture e);
typedef int (*MSSndCardGetLevelFunc)(struct _MSSndCard *obj, MSSndCardMixerElem e);
94
typedef int (*MSSndCardSetControlFunc)(struct _MSSndCard *obj, MSSndCardControlElem e, int val);
95
typedef int (*MSSndCardGetControlFunc)(struct _MSSndCard *obj, MSSndCardControlElem e);
aymeric's avatar
aymeric committed
96 97 98
typedef struct _MSFilter * (*MSSndCardCreateReaderFunc)(struct _MSSndCard *obj);
typedef struct _MSFilter * (*MSSndCardCreateWriterFunc)(struct _MSSndCard *obj);
typedef struct _MSSndCard * (*MSSndCardDuplicateFunc)(struct _MSSndCard *obj);
99
typedef void (*MSSndCardSetUsageHintFunc)(struct _MSSndCard *obj, bool_t is_going_to_be_used);
100
typedef void (*MSSndCardUnloadFunc)(MSSndCardManager *obj);
aymeric's avatar
aymeric committed
101

102

aymeric's avatar
aymeric committed
103 104 105 106 107 108 109
struct _MSSndCardDesc{
	const char *driver_type;
	MSSndCardDetectFunc detect;
	MSSndCardInitFunc init;
	MSSndCardSetLevelFunc set_level;
	MSSndCardGetLevelFunc get_level;
	MSSndCardSetCaptureFunc set_capture;
110 111
	MSSndCardSetControlFunc set_control;
	MSSndCardGetControlFunc get_control;
aymeric's avatar
aymeric committed
112 113 114 115
	MSSndCardCreateReaderFunc create_reader;
	MSSndCardCreateWriterFunc create_writer;
	MSSndCardUninitFunc uninit;
	MSSndCardDuplicateFunc duplicate;
116
	MSSndCardUnloadFunc unload;
117
	MSSndCardSetUsageHintFunc usage_hint;
aymeric's avatar
aymeric committed
118 119 120 121 122 123 124 125
};

/**
 * Structure for sound card description object.
 * @var MSSndCardDesc
 */
typedef struct _MSSndCardDesc MSSndCardDesc;

Simon Morlat's avatar
Simon Morlat committed
126 127 128
#define MS_SND_CARD_CAP_DISABLED (0) /**<This soundcard is disabled.*/
#define MS_SND_CARD_CAP_CAPTURE (1) /**<This sound card can capture sound */
#define MS_SND_CARD_CAP_PLAYBACK (1<<1) /**<This sound card can playback sound */
129
#define MS_SND_CARD_CAP_BUILTIN_ECHO_CANCELLER (1<<2) /**<This sound card has built-in echo cancellation*/
130
#define MS_SND_CARD_CAP_IS_SLOW (1<<3) /**<This sound card is very slow to start*/
aymeric's avatar
aymeric committed
131 132 133

struct _MSSndCard{
	MSSndCardDesc *desc;
134
	MSSndCardManager* sndcardmanager;
aymeric's avatar
aymeric committed
135 136 137 138
	char *name;
	char *id;
	unsigned int capabilities;
	void *data;
jehan's avatar
jehan committed
139
	int preferred_sample_rate;
Simon Morlat's avatar
Simon Morlat committed
140
	int latency;
aymeric's avatar
aymeric committed
141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163
};

/**
 * Structure for sound card object.
 * @var MSSndCard
 */
typedef struct _MSSndCard MSSndCard;

#ifdef __cplusplus
extern "C"{
#endif

/**
 * @defgroup mediastreamer2_soundcardmanager Sound Card Manager API
 * @ingroup mediastreamer2_soundcard
 * @{
 */

/**
 * Retreive a sound card manager object.
 *
 * Returns: MSSndCardManager if successfull, NULL otherwise.
 */
164
MS2_PUBLIC MS2_DEPRECATED MSSndCardManager * ms_snd_card_manager_get(void);
165 166 167 168 169 170

/**
 * Retrieve a factory from a sound card object.
 * @param c MSSndCard object.
 * Returns: MSFactory pointer.
 */
171
MS2_PUBLIC MSFactory * ms_snd_card_get_factory(MSSndCard * c);
aymeric's avatar
aymeric committed
172 173 174

/**
 * Destroy a sound card manager object.
175
 * You usually do not need this function, the ms_factory_destroy() doing this job for you.
aymeric's avatar
aymeric committed
176
 */
177
MS2_PUBLIC void ms_snd_card_manager_destroy(MSSndCardManager* sndcardmanager);
aymeric's avatar
aymeric committed
178 179 180 181 182 183 184 185 186

/**
 * Retreive a sound card object based on its name.
 *
 * @param m    A sound card manager containing sound cards.
 * @param id   A name for card to search.
 *
 * Returns: MSSndCard if successfull, NULL otherwise.
 */
Simon Morlat's avatar
Simon Morlat committed
187
MS2_PUBLIC MSSndCard * ms_snd_card_manager_get_card(MSSndCardManager *m, const char *id);
aymeric's avatar
aymeric committed
188 189 190 191 192 193 194 195

/**
 * Retreive the default sound card object.
 *
 * @param m    A sound card manager containing sound cards.
 *
 * Returns: MSSndCard if successfull, NULL otherwise.
 */
Simon Morlat's avatar
Simon Morlat committed
196
MS2_PUBLIC MSSndCard * ms_snd_card_manager_get_default_card(MSSndCardManager *m);
aymeric's avatar
aymeric committed
197

198 199 200 201 202 203 204
/**
 * Retreive the default capture sound card object.
 *
 * @param m    A sound card manager containing sound cards.
 *
 * Returns: MSSndCard if successfull, NULL otherwise.
 */
Simon Morlat's avatar
Simon Morlat committed
205
MS2_PUBLIC MSSndCard * ms_snd_card_manager_get_default_capture_card(MSSndCardManager *m);
206 207 208 209 210 211 212 213

/**
 * Retreive the default playback sound card object.
 *
 * @param m    A sound card manager containing sound cards.
 *
 * Returns: MSSndCard if successfull, NULL otherwise.
 */
Simon Morlat's avatar
Simon Morlat committed
214
MS2_PUBLIC MSSndCard * ms_snd_card_manager_get_default_playback_card(MSSndCardManager *m);
215

aymeric's avatar
aymeric committed
216 217 218 219 220 221 222
/**
 * Retreive the list of sound card objects.
 *
 * @param m    A sound card manager containing sound cards.
 *
 * Returns: MSList of cards if successfull, NULL otherwise.
 */
Simon Morlat's avatar
Simon Morlat committed
223
MS2_PUBLIC const MSList * ms_snd_card_manager_get_list(MSSndCardManager *m);
aymeric's avatar
aymeric committed
224 225 226 227 228 229 230 231

/**
 * Add a sound card object in a sound card manager's list.
 *
 * @param m    A sound card manager containing sound cards.
 * @param c    A sound card object.
 *
 */
Simon Morlat's avatar
Simon Morlat committed
232
MS2_PUBLIC void ms_snd_card_manager_add_card(MSSndCardManager *m, MSSndCard *c);
233
	
234 235 236 237 238 239 240
/**
 * Set the sound card manager of a sound card.
 *
 * @param m    A sound card manager containing sound cards.
 * @param c    A sound card object.
 *
 */
241
MS2_PUBLIC void ms_snd_card_set_manager(MSSndCardManager*m, MSSndCard *c);
aymeric's avatar
aymeric committed
242

243 244 245 246 247 248 249
/**
 * Prepend a list of sound card object to the sound card manager's list.
 * @param[in] m A sound card manager containing sound cards.
 * @param[in] l A list of sound card objects to be prepended to the sound card manager's list.
 */
MS2_PUBLIC void ms_snd_card_manager_prepend_cards(MSSndCardManager *m, MSList *l);

aymeric's avatar
aymeric committed
250 251 252 253 254 255 256
/**
 * Register a sound card description in a sound card manager.
 *
 * @param m      A sound card manager containing sound cards.
 * @param desc   A sound card description object.
 *
 */
Simon Morlat's avatar
Simon Morlat committed
257
MS2_PUBLIC void ms_snd_card_manager_register_desc(MSSndCardManager *m, MSSndCardDesc *desc);
aymeric's avatar
aymeric committed
258

259 260 261 262
/**
 * Ask all registered MSSndCardDesc to re-detect their soundcards.
 * @param m The sound card manager.
**/
Simon Morlat's avatar
Simon Morlat committed
263
MS2_PUBLIC void ms_snd_card_manager_reload(MSSndCardManager *m);
264

Simon Morlat's avatar
Simon Morlat committed
265

aymeric's avatar
aymeric committed
266 267 268 269 270 271 272 273 274 275 276 277 278 279 280
/** @} */

/**
 * @defgroup mediastreamer2_soundcardfilter Sound Card Filter API
 * @ingroup mediastreamer2_soundcard
 * @{
 */

/**
 * Create an INPUT filter based on the selected sound card.
 *
 * @param obj      A sound card object.
 *
 * Returns: A MSFilter if successfull, NULL otherwise.
 */
Simon Morlat's avatar
Simon Morlat committed
281
MS2_PUBLIC struct _MSFilter * ms_snd_card_create_reader(MSSndCard *obj);
aymeric's avatar
aymeric committed
282 283 284 285 286 287 288 289

/**
 * Create an OUPUT filter based on the selected sound card.
 *
 * @param obj      A sound card object.
 *
 * Returns: A MSFilter if successfull, NULL otherwise.
 */
Simon Morlat's avatar
Simon Morlat committed
290
MS2_PUBLIC struct _MSFilter * ms_snd_card_create_writer(MSSndCard *obj);
aymeric's avatar
aymeric committed
291 292 293 294 295 296 297 298

/**
 * Create a new sound card object.
 *
 * @param desc   A sound card description object.
 *
 * Returns: MSSndCard if successfull, NULL otherwise.
 */
Simon Morlat's avatar
Simon Morlat committed
299
MS2_PUBLIC MSSndCard * ms_snd_card_new(MSSndCardDesc *desc);
aymeric's avatar
aymeric committed
300

jehan's avatar
jehan committed
301 302 303 304
/**
 * Create a new sound card object.
 *
 * @param desc   A sound card description object.
305
 * @param name The card name
jehan's avatar
jehan committed
306 307 308 309
 *
 * Returns: MSSndCard if successfull, NULL otherwise.
 */
	
Simon Morlat's avatar
Simon Morlat committed
310
MS2_PUBLIC MSSndCard * ms_snd_card_new_with_name(MSSndCardDesc *desc,const char* name);
aymeric's avatar
aymeric committed
311 312 313 314 315
/**
 * Destroy sound card object.
 *
 * @param obj   A MSSndCard object.
 */
Simon Morlat's avatar
Simon Morlat committed
316
MS2_PUBLIC void ms_snd_card_destroy(MSSndCard *obj);
aymeric's avatar
aymeric committed
317 318 319 320 321 322 323 324 325 326

/**
 * Duplicate a sound card object.
 *
 * This helps to open several time a sound card.
 *
 * @param card   A sound card object.
 *
 * Returns: MSSndCard if successfull, NULL otherwise.
 */
Simon Morlat's avatar
Simon Morlat committed
327
MS2_PUBLIC MSSndCard * ms_snd_card_dup(MSSndCard *card);
aymeric's avatar
aymeric committed
328 329 330 331 332 333 334 335 336 337

/**
 * Retreive a sound card's driver type string.
 *
 * Internal driver types are either: "OSS, ALSA, WINSND, PASND, CA"
 *
 * @param obj   A sound card object.
 *
 * Returns: a string if successfull, NULL otherwise.
 */
Simon Morlat's avatar
Simon Morlat committed
338
MS2_PUBLIC const char *ms_snd_card_get_driver_type(const MSSndCard *obj);
aymeric's avatar
aymeric committed
339 340 341 342 343 344 345 346

/**
 * Retreive a sound card's name.
 *
 * @param obj   A sound card object.
 *
 * Returns: a string if successfull, NULL otherwise.
 */
Simon Morlat's avatar
Simon Morlat committed
347
MS2_PUBLIC const char *ms_snd_card_get_name(const MSSndCard *obj);
aymeric's avatar
aymeric committed
348 349 350 351 352 353 354 355

/**
 * Retreive sound card's name ($driver_type: $name).
 *
 * @param obj    A sound card object.
 *
 * Returns: A string if successfull, NULL otherwise.
 */
Simon Morlat's avatar
Simon Morlat committed
356
MS2_PUBLIC const char *ms_snd_card_get_string_id(MSSndCard *obj);
aymeric's avatar
aymeric committed
357 358 359 360 361 362 363 364 365


/**
 * Retreive sound card's capabilities.
 *
 * <PRE>
 *   MS_SND_CARD_CAP_CAPTURE
 *   MS_SND_CARD_CAP_PLAYBACK
 *   MS_SND_CARD_CAP_CAPTURE|MS_SND_CARD_CAP_PLAYBACK
366
 *   MS_SND_CARD_CAP_BUILTIN_ECHO_CANCELLER
aymeric's avatar
aymeric committed
367 368 369 370 371 372
 * </PRE>
 *
 * @param obj    A sound card object.
 *
 * Returns: A unsigned int if successfull, 0 otherwise.
 */
Simon Morlat's avatar
Simon Morlat committed
373
MS2_PUBLIC unsigned int ms_snd_card_get_capabilities(const MSSndCard *obj);
aymeric's avatar
aymeric committed
374

Simon Morlat's avatar
Simon Morlat committed
375 376 377 378 379 380 381 382 383
/**
 * Returns the sound card minimal latency (playback+record), in milliseconds.
 * This value is to be used by the software echo cancellers to know where to search for the echo (optimization).
 * Typically, an echo shall not be found before the value returned by this function.
 * If this value is not known, then it should return 0.
 * @param obj    A sound card object.
**/
MS2_PUBLIC int ms_snd_card_get_minimal_latency(MSSndCard *obj);

aymeric's avatar
aymeric committed
384 385 386 387 388 389 390 391 392 393 394 395 396 397 398
/**
 * Set some mixer level value.
 *
 * <PRE>
 *   MS_SND_CARD_MASTER,
 *   MS_SND_CARD_PLAYBACK,
 *   MS_SND_CARD_CAPTURE
 * </PRE>
 * Note: not implemented on all sound card filters.
 *
 * @param obj      A sound card object.
 * @param e        A sound card mixer object.
 * @param percent  A volume level.
 *
 */
Simon Morlat's avatar
Simon Morlat committed
399
MS2_PUBLIC void ms_snd_card_set_level(MSSndCard *obj, MSSndCardMixerElem e, int percent);
aymeric's avatar
aymeric committed
400 401 402 403 404 405 406 407 408 409 410 411 412 413

/**
 * Get some mixer level value.
 *
 * <PRE>
 *   MS_SND_CARD_MASTER,
 *   MS_SND_CARD_PLAYBACK,
 *   MS_SND_CARD_CAPTURE
 * </PRE>
 * Note: not implemented on all sound card filters.
 *
 * @param obj      A sound card object.
 * @param e        A sound card mixer object.
 *
414
 * Returns: A int if successfull, <0 otherwise.
aymeric's avatar
aymeric committed
415
 */
Simon Morlat's avatar
Simon Morlat committed
416
MS2_PUBLIC int ms_snd_card_get_level(MSSndCard *obj, MSSndCardMixerElem e);
aymeric's avatar
aymeric committed
417 418 419 420 421 422 423 424 425 426 427 428 429 430 431

/**
 * Set some source for capture.
 *
 * <PRE>
 *   MS_SND_CARD_MIC,
 *   MS_SND_CARD_LINE
 * </PRE>
 * Note: not implemented on all sound card filters.
 *
 * @param obj      A sound card object.
 * @param c        A sound card capture value.
 *
 * Returns: A int if successfull, 0 otherwise.
 */
Simon Morlat's avatar
Simon Morlat committed
432
MS2_PUBLIC void ms_snd_card_set_capture(MSSndCard *obj, MSSndCardCapture c);
aymeric's avatar
aymeric committed
433

434 435 436 437 438 439 440 441 442 443 444 445
/**
 * Set some mixer control.
 *
 * <PRE>
 *   MS_SND_CARD_MASTER_MUTE, -> 0: unmute, 1: mute
 *   MS_SND_CARD_PLAYBACK_MUTE, -> 0: unmute, 1: mute
 *   MS_SND_CARD_CAPTURE_MUTE -> 0: unmute, 1: mute
 * </PRE>
 * Note: not implemented on all sound card filters.
 *
 * @param obj      A sound card object.
 * @param e        A sound card control object.
446
 * @param val  A value for control.
447
 *
448
 * Returns: 0 if successfull, <0 otherwise.
449
 */
Simon Morlat's avatar
Simon Morlat committed
450
MS2_PUBLIC int ms_snd_card_set_control(MSSndCard *obj, MSSndCardControlElem e, int val);
451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466

/**
 * Get some mixer control.
 *
 * <PRE>
 *   MS_SND_CARD_MASTER_MUTE, -> return 0: unmute, 1: mute
 *   MS_SND_CARD_PLAYBACK_MUTE, -> return 0: unmute, 1: mute
 *   MS_SND_CARD_CAPTURE_MUTE -> return 0: unmute, 1: mute
 * </PRE>
 * Note: not implemented on all sound card filters.
 *
 * @param obj      A sound card object.
 * @param e        A sound card mixer object.
 *
 * Returns: A int if successfull, <0 otherwise.
 */
Simon Morlat's avatar
Simon Morlat committed
467
MS2_PUBLIC int ms_snd_card_get_control(MSSndCard *obj, MSSndCardControlElem e);
468

jehan's avatar
jehan committed
469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486
/**
 * Get preferred sample rate
 *
 * @param obj      A sound card object.
 *
 * Returns: return sample rate in khz
 */
MS2_PUBLIC int ms_snd_card_get_preferred_sample_rate(const MSSndCard *obj);

/**
 * set preferred sample rate. The underlying card will try to avoid any resampling for this samplerate.
 *
 * @param obj      A sound card object.
 * @param rate     sampling rate. 
 *
 * Returns:  0 if successfull, <0 otherwise.
 */
MS2_PUBLIC int ms_snd_card_set_preferred_sample_rate(MSSndCard *obj,int rate);
487 488 489 490 491 492

/**
 * Enable application to tell that the soundcard is going to be used or will cease to be used.
 * This is recommended for cards which are known to be slow (see flag MS_SND_CARD_CAP_IS_SLOW ).
**/
MS2_PUBLIC void ms_snd_card_set_usage_hint(MSSndCard *obj, bool_t is_going_to_be_used);
jehan's avatar
jehan committed
493

aymeric's avatar
aymeric committed
494 495 496 497 498 499 500
/**
 * Create a alsa card with user supplied pcm name and mixer name.
 * @param pcmdev The pcm device name following alsa conventions (ex: plughw:0)
 * @param mixdev The mixer device name following alsa conventions.
 *
 * Returns: a MSSndCard object, NULL if alsa support is not available.
 */
Simon Morlat's avatar
Simon Morlat committed
501
MS2_PUBLIC MSSndCard * ms_alsa_card_new_custom(const char *pcmdev, const char *mixdev);
aymeric's avatar
aymeric committed
502 503


504 505 506 507 508 509 510
/**
 * Use supplied sample rate to open alsa devices (forced rate).
 * Has no interest except workarouding driver bugs.
 * Use -1 to revert to normal behavior.
**/
MS2_PUBLIC void ms_alsa_card_set_forced_sample_rate(int samplerate);

aymeric's avatar
aymeric committed
511 512 513 514 515 516 517 518 519
/** @} */

#ifdef __cplusplus
}
#endif

/** @} */

#endif