/** Find matched descriptor in codec list */ MPF_DECLARE(mpf_codec_descriptor_t*) mpf_codec_list_descriptor_find(const mpf_codec_list_t *codec_list, const mpf_codec_descriptor_t *descriptor) { int i; mpf_codec_descriptor_t *matched_descriptor; for(i=0; i<codec_list->descriptor_arr->nelts; i++) { matched_descriptor = &APR_ARRAY_IDX(codec_list->descriptor_arr,i,mpf_codec_descriptor_t); if(mpf_codec_descriptors_match(descriptor,matched_descriptor) == TRUE) { return matched_descriptor; } } return NULL; }
MPF_DECLARE(mpf_object_t*) mpf_bridge_create( mpf_audio_stream_t *source, mpf_audio_stream_t *sink, const mpf_codec_manager_t *codec_manager, const char *name, apr_pool_t *pool) { if(!source || !sink) { return NULL; } if(mpf_audio_stream_rx_validate(source,sink->tx_descriptor,sink->tx_event_descriptor,pool) == FALSE || mpf_audio_stream_tx_validate(sink,source->rx_descriptor,source->rx_event_descriptor,pool) == FALSE) { return NULL; } if(mpf_codec_descriptors_match(source->rx_descriptor,sink->tx_descriptor) == TRUE) { return mpf_null_bridge_create(source,sink,codec_manager,name,pool); } if(mpf_codec_lpcm_descriptor_match(source->rx_descriptor) == FALSE) { mpf_codec_t *codec = mpf_codec_manager_codec_get(codec_manager,source->rx_descriptor,pool); if(codec) { /* set decoder before bridge */ mpf_audio_stream_t *decoder = mpf_decoder_create(source,codec,pool); source = decoder; } } if(mpf_codec_lpcm_descriptor_match(sink->tx_descriptor) == FALSE) { mpf_codec_t *codec = mpf_codec_manager_codec_get(codec_manager,sink->tx_descriptor,pool); if(codec) { /* set encoder after bridge */ mpf_audio_stream_t *encoder = mpf_encoder_create(sink,codec,pool); sink = encoder; } } if(source->rx_descriptor->sampling_rate != sink->tx_descriptor->sampling_rate) { /* set resampler before bridge */ mpf_audio_stream_t *resampler = mpf_resampler_create(source,sink,pool); if(!resampler) { return NULL; } source = resampler; } return mpf_linear_bridge_create(source,sink,codec_manager,name,pool); }