int libvlc_media_slaves_add( libvlc_media_t *p_md, libvlc_media_slave_type_t i_type, unsigned int i_priority, const char *psz_uri ) { assert( p_md && psz_uri ); input_item_t *p_input_item = p_md->p_input_item; enum slave_type i_input_slave_type; switch( i_type ) { case libvlc_media_slave_type_subtitle: i_input_slave_type = SLAVE_TYPE_SPU; break; case libvlc_media_slave_type_audio: i_input_slave_type = SLAVE_TYPE_AUDIO; break; default: vlc_assert_unreachable(); return -1; } enum slave_priority i_input_slave_priority; switch( i_priority ) { case 0: i_input_slave_priority = SLAVE_PRIORITY_MATCH_NONE; break; case 1: i_input_slave_priority = SLAVE_PRIORITY_MATCH_RIGHT; break; case 2: i_input_slave_priority = SLAVE_PRIORITY_MATCH_LEFT; break; case 3: i_input_slave_priority = SLAVE_PRIORITY_MATCH_ALL; break; default: case 4: i_input_slave_priority = SLAVE_PRIORITY_USER; break; } input_item_slave_t *p_slave = input_item_slave_New( psz_uri, i_input_slave_type, i_input_slave_priority ); if( p_slave == NULL ) return -1; return input_item_AddSlave( p_input_item, p_slave ) == VLC_SUCCESS ? 0 : -1; }
static void fsdir_attach_slaves(struct access_fsdir *p_fsdir) { if (p_fsdir->i_sub_autodetect_fuzzy == 0) return; /* Try to match slaves for each items of the node */ for (int i = 0; i < p_fsdir->p_node->i_children; i++) { input_item_node_t *p_node = p_fsdir->p_node->pp_children[i]; input_item_t *p_item = p_node->p_item; for (unsigned int j = 0; j < p_fsdir->i_slaves; j++) { struct fsdir_slave *p_fsdir_slave = p_fsdir->pp_slaves[j]; if (p_fsdir_slave == NULL || p_fsdir_slave->p_node == p_node) continue; uint8_t i_priority = fsdir_get_slave_priority(p_item, p_fsdir_slave->p_slave, p_fsdir_slave->psz_filename); if (i_priority < p_fsdir->i_sub_autodetect_fuzzy) continue; /* Drop the ".sub" slave if a ".idx" slave matches */ if (p_fsdir_slave->p_slave->i_type == SLAVE_TYPE_SPU && fsdir_should_match_idx(p_fsdir, p_fsdir_slave)) continue; p_fsdir_slave->p_slave->i_priority = i_priority; input_item_AddSlave(p_item, p_fsdir_slave->p_slave); /* Remove the corresponding node if any: This slave won't be * added in the parent node */ if (p_fsdir_slave->p_node != NULL) input_item_node_Delete(p_fsdir_slave->p_node); /* Remove this slave from the list: we don't want to match * other items */ free(p_fsdir_slave->psz_filename); free(p_fsdir_slave); p_fsdir->pp_slaves[j] = NULL; } } }