- Timestamp:
- Dec 3, 2013 7:14:22 AM (10 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
pjproject/branches/projects/pjsua2/pjsip/src/pjsua2/media.cpp
r4666 r4668 28 28 #define THIS_FILE "media.cpp" 29 29 #define MAX_FILE_NAMES 64 30 #define MAX_DEV_COUNT 64 31 32 /////////////////////////////////////////////////////////////////////////////// 33 void MediaFormatAudio::fromPj(const pjmedia_format &format) 34 { 35 if ((format.type != PJMEDIA_TYPE_AUDIO) && 36 (format.detail_type != PJMEDIA_FORMAT_DETAIL_AUDIO)) 37 { 38 type = PJMEDIA_TYPE_UNKNOWN; 39 return; 40 } 41 42 id = format.id; 43 type = format.type; 44 45 /* Detail. */ 46 clockRate = format.det.aud.clock_rate; 47 channelCount = format.det.aud.channel_count; 48 frameTimeUsec = format.det.aud.frame_time_usec; 49 bitsPerSample = format.det.aud.bits_per_sample; 50 avgBps = format.det.aud.avg_bps; 51 maxBps = format.det.aud.max_bps; 52 } 53 54 pjmedia_format MediaFormatAudio::toPj() const 55 { 56 pjmedia_format pj_format; 57 58 pj_format.id = id; 59 pj_format.type = type; 60 61 pj_format.detail_type = PJMEDIA_FORMAT_DETAIL_AUDIO; 62 pj_format.det.aud.clock_rate = clockRate; 63 pj_format.det.aud.channel_count = channelCount; 64 pj_format.det.aud.frame_time_usec = frameTimeUsec; 65 pj_format.det.aud.bits_per_sample = bitsPerSample; 66 pj_format.det.aud.avg_bps = avgBps; 67 pj_format.det.aud.max_bps = maxBps; 68 69 return pj_format; 70 } 30 71 31 72 /////////////////////////////////////////////////////////////////////////////// … … 254 295 255 296 /////////////////////////////////////////////////////////////////////////////// 256 257 297 AudioMediaRecorder::AudioMediaRecorder() 258 298 : recorderId(PJSUA_INVALID_ID) … … 287 327 registerMediaPort(NULL); 288 328 } 289 329 /////////////////////////////////////////////////////////////////////////////// 330 void AudioDevInfo::fromPj(const pjmedia_aud_dev_info &dev_info) 331 { 332 name = dev_info.name; 333 inputCount = dev_info.input_count; 334 outputCount = dev_info.output_count; 335 defaultSamplesPerSec = dev_info.default_samples_per_sec; 336 driver = dev_info.driver; 337 caps = dev_info.caps; 338 routes = dev_info.routes; 339 340 for (unsigned i=0; i<dev_info.ext_fmt_cnt;++i) { 341 MediaFormatAudio *format = new MediaFormatAudio; 342 343 format->fromPj(dev_info.ext_fmt[i]); 344 if (format->type == PJMEDIA_TYPE_AUDIO) 345 extFmt.push_back(format); 346 } 347 } 348 349 AudioDevInfo::~AudioDevInfo() 350 { 351 for(unsigned i=0;i<extFmt.size();++i) { 352 delete extFmt[i]; 353 } 354 extFmt.clear(); 355 } 356 /////////////////////////////////////////////////////////////////////////////// 357 /* Audio device operations. */ 358 359 int AudDevManager::getCaptureDev() const throw(Error) 360 { 361 return getActiveDev(true); 362 } 363 364 int AudDevManager::getPlaybackDev() const throw(Error) 365 { 366 return getActiveDev(false); 367 } 368 369 void AudDevManager::setCaptureDev(int capture_dev) const throw(Error) 370 { 371 int playback_dev = getPlaybackDev(); 372 373 PJSUA2_CHECK_EXPR( pjsua_set_snd_dev(capture_dev, playback_dev) ); 374 } 375 376 void AudDevManager::setPlaybackDev(int playback_dev) const throw(Error) 377 { 378 int capture_dev = getCaptureDev(); 379 380 PJSUA2_CHECK_EXPR( pjsua_set_snd_dev(capture_dev, playback_dev) ); 381 } 382 383 const AudioDevInfoVector &AudDevManager::enumDev() throw(Error) 384 { 385 pjmedia_aud_dev_info pj_info[MAX_DEV_COUNT]; 386 unsigned count; 387 388 clearAudioDevList(); 389 390 PJSUA2_CHECK_EXPR( pjsua_enum_aud_devs(pj_info, &count) ); 391 392 for (unsigned i = 0; (i<count && i<MAX_DEV_COUNT) ;++i) { 393 AudioDevInfo *dev_info = new AudioDevInfo; 394 dev_info->fromPj(pj_info[i]); 395 audioDevList.push_back(dev_info); 396 } 397 return audioDevList; 398 } 399 400 void AudDevManager::setNullDev() throw(Error) 401 { 402 PJSUA2_CHECK_EXPR( pjsua_set_null_snd_dev() ); 403 } 404 405 MediaPort *AudDevManager::setNoDev() 406 { 407 return (MediaPort*)pjsua_set_no_snd_dev(); 408 } 409 410 void AudDevManager::setEcOptions(unsigned tail_msec, 411 unsigned options) throw(Error) 412 { 413 PJSUA2_CHECK_EXPR( pjsua_set_ec(tail_msec, options) ); 414 } 415 416 unsigned AudDevManager::getEcTail() const throw(Error) 417 { 418 unsigned tail_msec = 0; 419 420 PJSUA2_CHECK_EXPR( pjsua_get_ec_tail(&tail_msec) ); 421 422 return tail_msec; 423 } 424 425 bool AudDevManager::sndIsActive() const 426 { 427 return pjsua_snd_is_active(); 428 } 429 430 void AudDevManager::refreshDevs() throw(Error) 431 { 432 PJSUA2_CHECK_EXPR( pjmedia_aud_dev_refresh() ); 433 } 434 435 unsigned AudDevManager::getDevCount() const 436 { 437 return pjmedia_aud_dev_count(); 438 } 439 440 AudioDevInfo 441 AudDevManager::getDevInfo(int id) const throw(Error) 442 { 443 AudioDevInfo dev_info; 444 pjmedia_aud_dev_info pj_info; 445 446 PJSUA2_CHECK_EXPR( pjmedia_aud_dev_get_info(id, &pj_info) ); 447 448 dev_info.fromPj(pj_info); 449 return dev_info; 450 } 451 452 int AudDevManager::lookupDev(const string &drv_name, 453 const string &dev_name) const throw(Error) 454 { 455 pjmedia_aud_dev_index pj_idx = 0; 456 457 PJSUA2_CHECK_EXPR( pjmedia_aud_dev_lookup(drv_name.c_str(), 458 dev_name.c_str(), 459 &pj_idx) ); 460 461 return pj_idx; 462 } 463 464 465 string AudDevManager::capName(pjmedia_aud_dev_cap cap) const 466 { 467 return pjmedia_aud_dev_cap_name(cap, NULL); 468 } 469 470 void 471 AudDevManager::setExtFormat(const MediaFormatAudio &format, 472 bool keep) throw(Error) 473 { 474 pjmedia_format pj_format = format.toPj(); 475 476 PJSUA2_CHECK_EXPR( pjsua_snd_set_setting(PJMEDIA_AUD_DEV_CAP_EXT_FORMAT, 477 &pj_format, 478 keep) ); 479 } 480 481 MediaFormatAudio AudDevManager::getExtFormat() const throw(Error) 482 { 483 pjmedia_format pj_format; 484 MediaFormatAudio format; 485 486 PJSUA2_CHECK_EXPR( pjsua_snd_get_setting(PJMEDIA_AUD_DEV_CAP_EXT_FORMAT, 487 &pj_format) ); 488 489 format.fromPj(pj_format); 490 491 return format; 492 } 493 494 void AudDevManager::setInputLatency(unsigned latency_msec, 495 bool keep) throw(Error) 496 { 497 PJSUA2_CHECK_EXPR( pjsua_snd_set_setting(PJMEDIA_AUD_DEV_CAP_INPUT_LATENCY, 498 &latency_msec, 499 keep) ); 500 } 501 502 unsigned AudDevManager::getInputLatency() const throw(Error) 503 { 504 unsigned latency_msec = 0; 505 506 PJSUA2_CHECK_EXPR( pjsua_snd_get_setting(PJMEDIA_AUD_DEV_CAP_INPUT_LATENCY, 507 &latency_msec) ); 508 509 return latency_msec; 510 } 511 512 void 513 AudDevManager::setOutputLatency(unsigned latency_msec, 514 bool keep) throw(Error) 515 { 516 PJSUA2_CHECK_EXPR( pjsua_snd_set_setting(PJMEDIA_AUD_DEV_CAP_OUTPUT_LATENCY, 517 &latency_msec, 518 keep) ); 519 } 520 521 unsigned AudDevManager::getOutputLatency() const throw(Error) 522 { 523 unsigned latency_msec = 0; 524 525 PJSUA2_CHECK_EXPR( pjsua_snd_get_setting(PJMEDIA_AUD_DEV_CAP_OUTPUT_LATENCY, 526 &latency_msec) ); 527 528 return latency_msec; 529 } 530 531 void AudDevManager::setInputVolume(unsigned volume, bool keep) throw(Error) 532 { 533 PJSUA2_CHECK_EXPR( 534 pjsua_snd_set_setting(PJMEDIA_AUD_DEV_CAP_INPUT_VOLUME_SETTING, 535 &volume, 536 keep) ); 537 } 538 539 unsigned AudDevManager::getInputVolume() const throw(Error) 540 { 541 unsigned volume = 0; 542 543 PJSUA2_CHECK_EXPR( 544 pjsua_snd_get_setting(PJMEDIA_AUD_DEV_CAP_INPUT_VOLUME_SETTING, 545 &volume) ); 546 547 return volume; 548 } 549 550 void AudDevManager::setOutputVolume(unsigned volume, bool keep) throw(Error) 551 { 552 PJSUA2_CHECK_EXPR( 553 pjsua_snd_set_setting(PJMEDIA_AUD_DEV_CAP_OUTPUT_VOLUME_SETTING, 554 &volume, 555 keep) ); 556 } 557 558 unsigned AudDevManager::getOutputVolume() const throw(Error) 559 { 560 unsigned volume = 0; 561 562 PJSUA2_CHECK_EXPR( 563 pjsua_snd_get_setting(PJMEDIA_AUD_DEV_CAP_OUTPUT_VOLUME_SETTING, 564 &volume) ); 565 566 return volume; 567 } 568 569 unsigned AudDevManager::getInputSignal() const throw(Error) 570 { 571 unsigned signal = 0; 572 573 PJSUA2_CHECK_EXPR( 574 pjsua_snd_get_setting(PJMEDIA_AUD_DEV_CAP_INPUT_SIGNAL_METER, 575 &signal) ); 576 577 return signal; 578 } 579 580 unsigned AudDevManager::getOutputSignal() const throw(Error) 581 { 582 unsigned signal = 0; 583 584 PJSUA2_CHECK_EXPR( 585 pjsua_snd_get_setting(PJMEDIA_AUD_DEV_CAP_OUTPUT_SIGNAL_METER, 586 &signal) ); 587 588 return signal; 589 } 590 591 void 592 AudDevManager::setInputRoute(pjmedia_aud_dev_route route, 593 bool keep) throw(Error) 594 { 595 PJSUA2_CHECK_EXPR( pjsua_snd_set_setting(PJMEDIA_AUD_DEV_CAP_INPUT_ROUTE, 596 &route, 597 keep) ); 598 } 599 600 pjmedia_aud_dev_route AudDevManager::getInputRoute() const throw(Error) 601 { 602 pjmedia_aud_dev_route route = PJMEDIA_AUD_DEV_ROUTE_DEFAULT; 603 604 PJSUA2_CHECK_EXPR( pjsua_snd_get_setting(PJMEDIA_AUD_DEV_CAP_INPUT_ROUTE, 605 &route) ); 606 607 return route; 608 } 609 610 void 611 AudDevManager::setOutputRoute(pjmedia_aud_dev_route route, 612 bool keep) throw(Error) 613 { 614 PJSUA2_CHECK_EXPR( pjsua_snd_set_setting(PJMEDIA_AUD_DEV_CAP_OUTPUT_ROUTE, 615 &route, 616 keep) ); 617 } 618 619 pjmedia_aud_dev_route AudDevManager::getOutputRoute() const throw(Error) 620 { 621 pjmedia_aud_dev_route route = PJMEDIA_AUD_DEV_ROUTE_DEFAULT; 622 623 PJSUA2_CHECK_EXPR( pjsua_snd_get_setting(PJMEDIA_AUD_DEV_CAP_OUTPUT_ROUTE, 624 &route) ); 625 626 return route; 627 } 628 629 void AudDevManager::setVad(bool enable, bool keep) throw(Error) 630 { 631 PJSUA2_CHECK_EXPR( pjsua_snd_set_setting(PJMEDIA_AUD_DEV_CAP_VAD, 632 &enable, 633 keep) ); 634 } 635 636 bool AudDevManager::getVad() const throw(Error) 637 { 638 bool enable = false; 639 640 PJSUA2_CHECK_EXPR( pjsua_snd_get_setting(PJMEDIA_AUD_DEV_CAP_VAD, 641 &enable) ); 642 643 return enable; 644 } 645 646 void AudDevManager::setCng(bool enable, bool keep) throw(Error) 647 { 648 PJSUA2_CHECK_EXPR( pjsua_snd_set_setting(PJMEDIA_AUD_DEV_CAP_CNG, 649 &enable, 650 keep) ); 651 } 652 653 bool AudDevManager::getCng() const throw(Error) 654 { 655 bool enable = false; 656 657 PJSUA2_CHECK_EXPR( pjsua_snd_get_setting(PJMEDIA_AUD_DEV_CAP_CNG, 658 &enable) ); 659 660 return enable; 661 } 662 663 void AudDevManager::setPlc(bool enable, bool keep) throw(Error) 664 { 665 PJSUA2_CHECK_EXPR( pjsua_snd_set_setting(PJMEDIA_AUD_DEV_CAP_PLC, 666 &enable, 667 keep) ); 668 } 669 670 bool AudDevManager::getPlc() const throw(Error) 671 { 672 bool enable = false; 673 674 PJSUA2_CHECK_EXPR( pjsua_snd_get_setting(PJMEDIA_AUD_DEV_CAP_PLC, 675 &enable) ); 676 677 return enable; 678 } 679 680 AudDevManager::AudDevManager() 681 { 682 683 684 } 685 686 AudDevManager::~AudDevManager() 687 { 688 clearAudioDevList(); 689 } 690 691 void AudDevManager::clearAudioDevList() 692 { 693 for(unsigned i=0;i<audioDevList.size();++i) { 694 delete audioDevList[i]; 695 } 696 audioDevList.clear(); 697 } 698 699 int AudDevManager::getActiveDev(bool is_capture) const throw(Error) 700 { 701 int capture_dev = 0, playback_dev = 0; 702 PJSUA2_CHECK_EXPR( pjsua_get_snd_dev(&capture_dev, &playback_dev) ); 703 704 return is_capture?capture_dev:playback_dev; 705 }
Note: See TracChangeset
for help on using the changeset viewer.