Ignore:
Timestamp:
Dec 3, 2013 7:14:22 AM (10 years ago)
Author:
riza
Message:

Re #1519: Added audio device management operations to Media API in pjsua2.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • pjproject/branches/projects/pjsua2/pjsip/src/pjsua2/media.cpp

    r4666 r4668  
    2828#define THIS_FILE               "media.cpp" 
    2929#define MAX_FILE_NAMES          64 
     30#define MAX_DEV_COUNT           64 
     31 
     32/////////////////////////////////////////////////////////////////////////////// 
     33void 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 
     54pjmedia_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} 
    3071 
    3172/////////////////////////////////////////////////////////////////////////////// 
     
    254295 
    255296/////////////////////////////////////////////////////////////////////////////// 
    256  
    257297AudioMediaRecorder::AudioMediaRecorder() 
    258298: recorderId(PJSUA_INVALID_ID) 
     
    287327    registerMediaPort(NULL); 
    288328} 
    289  
     329/////////////////////////////////////////////////////////////////////////////// 
     330void 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 
     349AudioDevInfo::~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 
     359int AudDevManager::getCaptureDev() const throw(Error) 
     360{ 
     361    return getActiveDev(true); 
     362} 
     363 
     364int AudDevManager::getPlaybackDev() const throw(Error) 
     365{ 
     366    return getActiveDev(false); 
     367} 
     368 
     369void 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 
     376void 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 
     383const 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 
     400void AudDevManager::setNullDev() throw(Error) 
     401{ 
     402    PJSUA2_CHECK_EXPR( pjsua_set_null_snd_dev() ); 
     403} 
     404 
     405MediaPort *AudDevManager::setNoDev() 
     406{ 
     407    return (MediaPort*)pjsua_set_no_snd_dev(); 
     408} 
     409 
     410void AudDevManager::setEcOptions(unsigned tail_msec, 
     411                                 unsigned options) throw(Error) 
     412{ 
     413    PJSUA2_CHECK_EXPR( pjsua_set_ec(tail_msec, options) ); 
     414} 
     415 
     416unsigned 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 
     425bool AudDevManager::sndIsActive() const 
     426{ 
     427    return pjsua_snd_is_active(); 
     428} 
     429 
     430void AudDevManager::refreshDevs() throw(Error) 
     431{ 
     432    PJSUA2_CHECK_EXPR( pjmedia_aud_dev_refresh() ); 
     433} 
     434 
     435unsigned AudDevManager::getDevCount() const 
     436{ 
     437    return pjmedia_aud_dev_count(); 
     438} 
     439 
     440AudioDevInfo 
     441AudDevManager::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 
     452int 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 
     465string AudDevManager::capName(pjmedia_aud_dev_cap cap) const 
     466{ 
     467    return pjmedia_aud_dev_cap_name(cap, NULL); 
     468} 
     469 
     470void 
     471AudDevManager::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 
     481MediaFormatAudio 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 
     494void 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 
     502unsigned 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 
     512void 
     513AudDevManager::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 
     521unsigned 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 
     531void 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 
     539unsigned 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 
     550void 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 
     558unsigned 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 
     569unsigned 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 
     580unsigned 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 
     591void 
     592AudDevManager::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 
     600pjmedia_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 
     610void 
     611AudDevManager::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 
     619pjmedia_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 
     629void 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 
     636bool 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 
     646void 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 
     653bool 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 
     663void 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 
     670bool 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 
     680AudDevManager::AudDevManager() 
     681{ 
     682 
     683 
     684} 
     685 
     686AudDevManager::~AudDevManager() 
     687{ 
     688    clearAudioDevList(); 
     689} 
     690 
     691void AudDevManager::clearAudioDevList() 
     692{ 
     693    for(unsigned i=0;i<audioDevList.size();++i) { 
     694        delete audioDevList[i]; 
     695    } 
     696    audioDevList.clear(); 
     697} 
     698 
     699int 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.