Ignore:
Timestamp:
Jul 19, 2011 3:42:28 AM (13 years ago)
Author:
nanang
Message:

Re #1326: Initial code integration from branch 2.0-dev to trunk as "2.0-pre-alpha-svn".

Location:
pjproject/trunk
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • pjproject/trunk

  • pjproject/trunk/pjmedia/src/pjmedia/conf_switch.c

    r3553 r3664  
    2424#include <pjmedia/silencedet.h> 
    2525#include <pjmedia/sound_port.h> 
    26 #include <pjmedia/stream.h> 
    2726#include <pj/array.h> 
    2827#include <pj/assert.h> 
    2928#include <pj/log.h> 
     29#include <pj/math.h> 
    3030#include <pj/pool.h> 
    3131#include <pj/string.h> 
     
    8181    /* Shortcut for port info. */ 
    8282    pjmedia_port_info   *info; 
     83    unsigned             samples_per_frame; 
    8384 
    8485    /* Calculated signal levels: */ 
     
    124125/* Prototypes */ 
    125126static pj_status_t put_frame(pjmedia_port *this_port,  
    126                              const pjmedia_frame *frame); 
     127                             pjmedia_frame *frame); 
    127128static pj_status_t get_frame(pjmedia_port *this_port,  
    128129                             pjmedia_frame *frame); 
     
    167168    conf_port->port = port; 
    168169    conf_port->info = &port->info; 
     170    conf_port->samples_per_frame= PJMEDIA_PINFO_SAMPLES_PER_FRAME(&port->info); 
    169171 
    170172    /* Init pjmedia_frame structure in the TX buffer. */ 
     
    505507    struct conf_port *src_port, *dst_port; 
    506508    pj_bool_t start_sound = PJ_FALSE; 
     509    pjmedia_audio_format_detail *src_afd, *dst_afd; 
    507510    unsigned i; 
    508511 
     
    524527    } 
    525528 
     529    src_afd = pjmedia_format_get_audio_format_detail(&src_port->info->fmt, 1); 
     530    dst_afd = pjmedia_format_get_audio_format_detail(&dst_port->info->fmt, 1); 
     531 
    526532    /* Format must match. */ 
    527     if (src_port->info->format.id != dst_port->info->format.id || 
    528         src_port->info->format.bitrate != dst_port->info->format.bitrate)  
     533    if (src_port->info->fmt.id != dst_port->info->fmt.id || 
     534        src_afd->avg_bps != dst_afd->avg_bps) 
    529535    { 
    530536        pj_mutex_unlock(conf->mutex); 
     
    533539 
    534540    /* Clock rate must match. */ 
    535     if (src_port->info->clock_rate != dst_port->info->clock_rate) { 
     541    if (src_afd->clock_rate != dst_afd->clock_rate) { 
    536542        pj_mutex_unlock(conf->mutex); 
    537543        return PJMEDIA_ENCCLOCKRATE; 
     
    539545 
    540546    /* Channel count must match. */ 
    541     if (src_port->info->channel_count != dst_port->info->channel_count) { 
     547    if (src_afd->channel_count != dst_afd->channel_count) { 
    542548        pj_mutex_unlock(conf->mutex); 
    543549        return PJMEDIA_ENCCLOCKRATE; 
     
    545551 
    546552    /* Source and sink ptime must be equal or a multiplication factor. */ 
    547     if ((src_port->info->samples_per_frame %  
    548          dst_port->info->samples_per_frame != 0) && 
    549         (dst_port->info->samples_per_frame %  
    550          src_port->info->samples_per_frame != 0)) 
     553    if ((src_afd->frame_time_usec % dst_afd->frame_time_usec != 0) && 
     554        (dst_afd->frame_time_usec % src_afd->frame_time_usec != 0)) 
    551555    { 
    552556        pj_mutex_unlock(conf->mutex); 
     
    830834{ 
    831835    struct conf_port *conf_port; 
     836    const pjmedia_audio_format_detail *afd; 
    832837 
    833838    /* Check arguments */ 
     
    843848        return PJ_EINVAL; 
    844849    } 
     850 
     851    afd = pjmedia_format_get_audio_format_detail(&conf_port->info->fmt, 1); 
    845852 
    846853    pj_bzero(info, sizeof(pjmedia_conf_port_info)); 
     
    853860    info->listener_slots = conf_port->listener_slots; 
    854861    info->transmitter_cnt = conf_port->transmitter_cnt; 
    855     info->clock_rate = conf_port->info->clock_rate; 
    856     info->channel_count = conf_port->info->channel_count; 
    857     info->samples_per_frame = conf_port->info->samples_per_frame; 
    858     info->bits_per_sample = conf_port->info->bits_per_sample; 
    859     info->format = conf_port->port->info.format; 
     862    info->clock_rate = afd->clock_rate; 
     863    info->channel_count = afd->channel_count; 
     864    info->samples_per_frame = conf_port->samples_per_frame; 
     865    info->bits_per_sample = afd->bits_per_sample; 
     866    info->format = conf_port->port->info.fmt; 
    860867    info->tx_adj_level = conf_port->tx_adj_level - NORMAL_LEVEL; 
    861868    info->rx_adj_level = conf_port->rx_adj_level - NORMAL_LEVEL; 
     
    961968 
    962969    /* Level adjustment is applicable only for ports that work with raw PCM. */ 
    963     PJ_ASSERT_RETURN(conf_port->info->format.id == PJMEDIA_FORMAT_L16, 
     970    PJ_ASSERT_RETURN(conf_port->info->fmt.id == PJMEDIA_FORMAT_L16, 
    964971                     PJ_EIGNORED); 
    965972 
     
    10031010 
    10041011    /* Level adjustment is applicable only for ports that work with raw PCM. */ 
    1005     PJ_ASSERT_RETURN(conf_port->info->format.id == PJMEDIA_FORMAT_L16, 
     1012    PJ_ASSERT_RETURN(conf_port->info->fmt.id == PJMEDIA_FORMAT_L16, 
    10061013                     PJ_EIGNORED); 
    10071014 
     
    10471054             * samples per frame. 
    10481055             */ 
    1049             if (f_dst->samples_cnt >= cport_dst->info->samples_per_frame) 
     1056            if (f_dst->samples_cnt >= cport_dst->samples_per_frame) 
    10501057            { 
    10511058                if (cport_dst->slot) { 
     
    10591066 
    10601067                /* Update TX timestamp. */ 
    1061                 pj_add_timestamp32(&cport_dst->ts_tx,  
    1062                                    cport_dst->info->samples_per_frame); 
     1068                pj_add_timestamp32(&cport_dst->ts_tx, 
     1069                                   cport_dst->samples_per_frame); 
    10631070            } 
    10641071        } 
     
    10761083            /* Copy frame to listener's TX buffer. */ 
    10771084            nsamples_to_copy = f_end - f_start; 
    1078             nsamples_req = cport_dst->info->samples_per_frame -  
     1085            nsamples_req = cport_dst->samples_per_frame - 
    10791086                          (frm_dst->size>>1); 
    10801087            if (nsamples_to_copy > nsamples_req) 
     
    11131120             * samples per frame. 
    11141121             */ 
    1115             if ((frm_dst->size >> 1) == cport_dst->info->samples_per_frame) 
     1122            if ((frm_dst->size >> 1) == cport_dst->samples_per_frame) 
    11161123            { 
    11171124                if (cport_dst->slot) { 
     
    11241131                /* Update TX timestamp. */ 
    11251132                pj_add_timestamp32(&cport_dst->ts_tx,  
    1126                                    cport_dst->info->samples_per_frame); 
     1133                                   cport_dst->samples_per_frame); 
    11271134            } 
    11281135        } 
     
    11321139        /* Check port format. */ 
    11331140        if (cport_dst->port && 
    1134             cport_dst->port->info.format.id == PJMEDIA_FORMAT_L16) 
     1141            cport_dst->port->info.fmt.id == PJMEDIA_FORMAT_L16) 
    11351142        { 
    11361143            /* When there is already some samples in listener's TX buffer,  
     
    11391146            if (frm_dst->size != 0) { 
    11401147                pjmedia_zero_samples((pj_int16_t*)frm_dst->buf, 
    1141                                      cport_dst->info->samples_per_frame -  
     1148                                     cport_dst->samples_per_frame - 
    11421149                                     (frm_dst->size>>1)); 
    11431150 
    11441151                frm_dst->type = PJMEDIA_FRAME_TYPE_AUDIO; 
    1145                 frm_dst->size = cport_dst->info->samples_per_frame << 1; 
     1152                frm_dst->size = cport_dst->samples_per_frame << 1; 
    11461153                if (cport_dst->slot) { 
    11471154                    pjmedia_port_put_frame(cport_dst->port, frm_dst); 
     
    11531160                /* Update TX timestamp. */ 
    11541161                pj_add_timestamp32(&cport_dst->ts_tx,  
    1155                                    cport_dst->info->samples_per_frame); 
     1162                                   cport_dst->samples_per_frame); 
    11561163            } 
    11571164        } else { 
     
    11611168                frm_dst->type = PJMEDIA_FRAME_TYPE_EXTENDED; 
    11621169                pjmedia_frame_ext_append_subframe(f_dst, NULL, 0, (pj_uint16_t) 
    1163                     (cport_dst->info->samples_per_frame - f_dst->samples_cnt)); 
     1170                    (cport_dst->samples_per_frame - f_dst->samples_cnt)); 
    11641171                if (cport_dst->slot) { 
    11651172                    pjmedia_port_put_frame(cport_dst->port, frm_dst); 
     
    11721179                /* Update TX timestamp. */ 
    11731180                pj_add_timestamp32(&cport_dst->ts_tx,  
    1174                                    cport_dst->info->samples_per_frame); 
     1181                                   cport_dst->samples_per_frame); 
    11751182            } 
    11761183        } 
     
    11861193 
    11871194            /* Update TX timestamp. */ 
    1188             pj_add_timestamp32(&cport_dst->ts_tx, cport_dst->info->samples_per_frame); 
     1195            pj_add_timestamp32(&cport_dst->ts_tx, cport_dst->samples_per_frame); 
    11891196        } 
    11901197    } 
     
    12121219    for (i=1, ci=1; i<conf->max_ports && ci<conf->port_cnt; ++i) { 
    12131220        struct conf_port *cport = conf->ports[i]; 
     1221        unsigned master_samples_per_frame; 
    12141222 
    12151223        /* Skip empty port. */ 
     
    12201228        ++ci; 
    12211229 
     1230        master_samples_per_frame = PJMEDIA_PINFO_SAMPLES_PER_FRAME( 
     1231                                        &conf->master_port->info); 
     1232 
    12221233        /* Update clock of the port. */ 
    1223         pj_add_timestamp32(&cport->ts_clock,  
    1224                            conf->master_port->info.samples_per_frame); 
     1234        pj_add_timestamp32(&cport->ts_clock, master_samples_per_frame); 
    12251235 
    12261236        /* Skip if we're not allowed to receive from this port or  
     
    12311241        { 
    12321242            cport->rx_level = 0; 
    1233             pj_add_timestamp32(&cport->ts_rx,  
    1234                                conf->master_port->info.samples_per_frame); 
     1243            pj_add_timestamp32(&cport->ts_rx, master_samples_per_frame); 
    12351244            continue; 
    12361245        } 
     
    12461255            pj_int32_t level = 0; 
    12471256 
    1248             pj_add_timestamp32(&cport->ts_rx, cport->info->samples_per_frame); 
     1257            pj_add_timestamp32(&cport->ts_rx, cport->samples_per_frame); 
    12491258             
    12501259            f->buf = &conf->buf[sizeof(pjmedia_frame)]; 
    1251             f->size = cport->info->samples_per_frame<<1; 
     1260            f->size = cport->samples_per_frame<<1; 
    12521261 
    12531262            /* Get frame from port. */ 
     
    13031312                if (listener->tx_setting == PJMEDIA_PORT_DISABLE) { 
    13041313                    pj_add_timestamp32(&listener->ts_tx,  
    1305                                        listener->info->samples_per_frame); 
     1314                                       listener->samples_per_frame); 
    13061315                    listener->tx_level = 0; 
    13071316                    continue; 
     
    13621371 
    13631372                    pjmedia_port_put_frame(cport->port, &tmp_f); 
    1364                     pj_add_timestamp32(&cport->ts_tx, cport->info->samples_per_frame); 
     1373                    pj_add_timestamp32(&cport->ts_tx, cport->samples_per_frame); 
    13651374                } 
    13661375            } 
     
    13811390            unsigned samples_per_subframe; 
    13821391             
    1383             if (f_src_->samples_cnt < this_cport->info->samples_per_frame) { 
     1392            if (f_src_->samples_cnt < this_cport->samples_per_frame) { 
    13841393                f_dst->base.type = PJMEDIA_FRAME_TYPE_NONE; 
    13851394                f_dst->samples_cnt = 0; 
     
    13941403 
    13951404 
    1396             while (f_dst->samples_cnt < this_cport->info->samples_per_frame) { 
     1405            while (f_dst->samples_cnt < this_cport->samples_per_frame) { 
    13971406                sf = pjmedia_frame_ext_get_subframe(f_src_, i++); 
    13981407                pj_assert(sf); 
     
    14051414 
    14061415        } else if (f_src->type == PJMEDIA_FRAME_TYPE_AUDIO) { 
    1407             if ((f_src->size>>1) < this_cport->info->samples_per_frame) { 
     1416            if ((f_src->size>>1) < this_cport->samples_per_frame) { 
    14081417                frame->type = PJMEDIA_FRAME_TYPE_NONE; 
    14091418                frame->size = 0; 
     
    14131422            pjmedia_copy_samples((pj_int16_t*)frame->buf,  
    14141423                                 (pj_int16_t*)f_src->buf,  
    1415                                  this_cport->info->samples_per_frame); 
    1416             frame->size = this_cport->info->samples_per_frame << 1; 
     1424                                 this_cport->samples_per_frame); 
     1425            frame->size = this_cport->samples_per_frame << 1; 
    14171426 
    14181427            /* Shift left TX buffer. */ 
     
    14211430                pjmedia_move_samples((pj_int16_t*)f_src->buf, 
    14221431                                     (pj_int16_t*)f_src->buf +  
    1423                                      this_cport->info->samples_per_frame, 
     1432                                     this_cport->samples_per_frame, 
    14241433                                     f_src->size >> 1); 
    14251434        } else { /* PJMEDIA_FRAME_TYPE_NONE */ 
     
    14431452 */ 
    14441453static pj_status_t put_frame(pjmedia_port *this_port,  
    1445                              const pjmedia_frame *f) 
     1454                             pjmedia_frame *f) 
    14461455{ 
    14471456    pjmedia_conf *conf = (pjmedia_conf*) this_port->port_data.pdata; 
     
    14611470    } 
    14621471 
    1463     pj_add_timestamp32(&cport->ts_rx, cport->info->samples_per_frame); 
     1472    pj_add_timestamp32(&cport->ts_rx, cport->samples_per_frame); 
    14641473     
    14651474    /* Skip if this port is muted/disabled. */ 
     
    15271536        if (listener->tx_setting == PJMEDIA_PORT_DISABLE) { 
    15281537            pj_add_timestamp32(&listener->ts_tx,  
    1529                                listener->info->samples_per_frame); 
     1538                               listener->samples_per_frame); 
    15301539            listener->tx_level = 0; 
    15311540            continue; 
     
    15351544        if (listener == cport) { 
    15361545            pj_add_timestamp32(&listener->ts_tx,  
    1537                                listener->info->samples_per_frame); 
     1546                               listener->samples_per_frame); 
    15381547            listener->tx_level = 0; 
    15391548            continue; 
Note: See TracChangeset for help on using the changeset viewer.