Changeset 2241

Show
Ignore:
Timestamp:
02/20/99 11:36:08 (15 years ago)
Author:
ucacoxh
Message:

- Added source flush if mix fails (source sample rate change).

- Added repair failure code, should only fail if sample rate changes.

Location:
rat/trunk
Files:
4 modified

Legend:

Unmodified
Added
Removed
  • rat/trunk/mix.c

    r2239 r2241  
    145145} 
    146146 
    147 void 
     147 
     148/* mix_process mixes a single audio frame into mix buffer.  It returns 
     149 * TRUE if incoming audio frame is compatible with mix, FALSE 
     150 * otherwise.  */ 
     151 
     152int 
    148153mix_process(mix_struct          *ms, 
    149154            rtcp_dbentry        *dbe, 
     
    159164 
    160165        codec_get_native_info(frame->id, &rate, &channels); 
     166 
     167        if (rate != ms->rate || channels != ms->channels) { 
     168                /* This should only occur if source changes sample rate 
     169                 * mid-stream and before buffering runs dry in end host. 
     170                 * This should be a very rare event. 
     171                 */ 
     172                debug_msg("Unit (%d, %d) not compitible with mix (%d, %d).\n", 
     173                          rate, 
     174                          channels, 
     175                          ms->rate, 
     176                          ms->channels); 
     177                return FALSE; 
     178        } 
    161179 
    162180        assert(rate     == (u_int32)ms->rate); 
     
    244262        dbe->last_mixed = playout; 
    245263 
    246         return; 
     264        return TRUE; 
    247265} 
    248266 
  • rat/trunk/mix.h

    r2239 r2241  
    5959void mix_destroy (struct s_mix_info **ms); 
    6060 
    61 void mix_process(struct s_mix_info     *ms, 
     61int mix_process(struct s_mix_info     *ms, 
    6262                  struct s_rtcp_dbentry *dbe, 
    6363                  coded_unit            *raw_frame, 
  • rat/trunk/source.c

    r2240 r2241  
    456456                         sizeof(media_data), 
    457457                         fill_ts); 
    458         assert(success); 
    459         src->consec_lost ++; 
    460         src->last_repair = fill_ts; 
    461         pb_iterator_advance(src->media_pos); 
     458        if (success) { 
     459                src->consec_lost ++; 
     460                src->last_repair = fill_ts; 
     461                pb_iterator_advance(src->media_pos); 
    462462 
    463463#ifndef NDEBUG 
     
    469469        assert(ts_eq(prev_ts, fill_ts)); 
    470470#endif 
     471        } else { 
     472                /* This should only ever fail at when source changes 
     473                 * sample rate in less time than playout buffer 
     474                 * timeout.  This should be a very very rare event...   
     475                 */ 
     476                debug_msg("Repair add data failed.\n"); 
     477                media_data_destroy(&fill_md, sizeof(media_data)); 
     478                src->consec_lost = 0; 
     479        } 
    471480} 
    472481 
     
    582591                } 
    583592 
    584                 mix_process(ms, src->dbe, md->rep[md->nrep - 1], playout); 
     593                if (mix_process(ms, src->dbe, md->rep[md->nrep - 1], playout) == FALSE) { 
     594                        /* Sources sampling rate changed mid-flow?, 
     595                         * dump data, make source look irrelevant, it 
     596                         * should get destroyed and the recreated with 
     597                         * proper decode path when new data arrives. 
     598                         * Not graceful..  A better way would be just 
     599                         * to flush media then invoke source_reconfigure  
     600                         * if this is ever really an issue. 
     601                         */ 
     602                        pb_flush(src->media); 
     603                        pb_flush(src->channel); 
     604                } 
    585605 
    586606                src->last_played = playout; 
  • rat/trunk/statistics.c

    r2239 r2241  
    427427 
    428428        if (dbe->enc != codec_pt) { 
     429                debug_msg("Format changed\n"); 
    429430                change_freq(dbe->clock, cf->format.sample_rate); 
    430431                dbe->enc             = codec_pt;