+ switch( i_query )
+ {
+ /* Pass back a copy of meta information that was gathered when we
+ during the Open/Initialize call.
+ */
+ case ACCESS_GET_META:
+ {
+ vlc_meta_t **pp_meta = (vlc_meta_t**)va_arg( args, vlc_meta_t** );
+
+ dbg_print( INPUT_DBG_EVENT, "get meta info" );
+#if 0
+ if( p_vcdplayer->p_meta )
+ {
+ *pp_meta = vlc_meta_Duplicate( p_vcdplayer->p_meta );
+ dbg_print( INPUT_DBG_META, "%s", "Meta copied" );
+ }
+ else
+#endif
+ msg_Warn( p_access, "tried to copy NULL meta info" );
+
+ return VLC_SUCCESS;
+ }
+ return VLC_EGENERIC;
+
+ case ACCESS_CAN_SEEK:
+ case ACCESS_CAN_FASTSEEK:
+ case ACCESS_CAN_PAUSE:
+ case ACCESS_CAN_CONTROL_PACE:
+ {
+ bool *pb_bool = (bool*)va_arg( args, bool* );
+
+ dbg_print( INPUT_DBG_EVENT,
+ "seek/fastseek/pause/can_control_pace" );
+ *pb_bool = true;
+ return VLC_SUCCESS;
+ break;
+ }
+
+ /* */
+ case ACCESS_GET_MTU:
+ pi_int = (int*)va_arg( args, int * );
+ *pi_int = (p_vcdplayer->i_blocks_per_read * M2F2_SECTOR_SIZE);
+ dbg_print( INPUT_DBG_EVENT, "GET MTU: %d", *pi_int );
+ break;
+
+ case ACCESS_GET_PTS_DELAY:
+ {
+ int64_t *pi_64 = (int64_t*)va_arg( args, int64_t * );
+ *pi_64 = var_GetInteger( p_access, MODULE_STRING "-caching" )
+ * MILLISECONDS_PER_SEC;
+ dbg_print( INPUT_DBG_EVENT, "GET PTS DELAY" );
+ return VLC_SUCCESS;
+ break;
+ }
+
+ /* */
+ case ACCESS_SET_PAUSE_STATE:
+ dbg_print( INPUT_DBG_EVENT, "SET PAUSE STATE" );
+ return VLC_SUCCESS;
+ break;
+
+ case ACCESS_GET_TITLE_INFO:
+ {
+ unsigned int psz_mrl_max = strlen(VCD_MRL_PREFIX)
+ + strlen(p_vcdplayer->psz_source) + sizeof("@E999")+3;
+ input_title_t ***ppp_title
+ = (input_title_t***)va_arg( args, input_title_t*** );
+ char *psz_mrl = malloc( psz_mrl_max );
+ unsigned int i;
+
+ pi_int = (int*)va_arg( args, int* );
+
+ dbg_print( INPUT_DBG_EVENT, "GET TITLE: i_titles %d",
+ p_vcdplayer->i_titles );
+
+ if( psz_mrl == NULL ) {
+ msg_Warn( p_access, "out of memory" );
+ } else {
+ snprintf(psz_mrl, psz_mrl_max, "%s%s",
+ VCD_MRL_PREFIX, p_vcdplayer->psz_source);
+ VCDMetaInfo( p_access, psz_mrl );
+ free(psz_mrl);
+ }
+
+ /* Duplicate title info */
+ if( p_vcdplayer->i_titles == 0 )
+ {
+ *pi_int = 0; ppp_title = NULL;
+ return VLC_SUCCESS;
+ }
+ *pi_int = p_vcdplayer->i_titles;
+ *ppp_title = malloc( sizeof( input_title_t **)
+ * p_vcdplayer->i_titles );
+
+ if (!*ppp_title) return VLC_ENOMEM;
+
+ for( i = 0; i < p_vcdplayer->i_titles; i++ )
+ {
+ if ( p_vcdplayer->p_title[i] )
+ (*ppp_title)[i] =
+ vlc_input_title_Duplicate( p_vcdplayer->p_title[i] );
+ }
+ }
+ break;
+
+ case ACCESS_SET_TITLE:
+ i = (int)va_arg( args, int );
+
+ dbg_print( INPUT_DBG_EVENT, "set title %d" , i);
+ if( i != p_access->info.i_title )
+ {
+ vcdinfo_itemid_t itemid;
+ track_t i_track = i+1;
+ unsigned int i_entry =
+ vcdinfo_track_get_entry( p_vcdplayer->vcd, i_track);
+
+ if( i < p_vcdplayer->i_tracks )
+ {
+ /* FIXME! For now we are assuming titles are only
+ tracks and that track == title+1 */
+ itemid.num = i_track;
+ itemid.type = VCDINFO_ITEM_TYPE_TRACK;
+ }
+ else
+ {
+ /* FIXME! i_tracks+2 are Segments, but we need to
+ be able to figure out which segment of that.
+ i_tracks+1 is either Segments (if no LIDs) or
+ LIDs otherwise. Again need a way to get the LID
+ number. */
+ msg_Warn( p_access,
+ "Trying to set track (%u) beyond end of last track (%u).",
+ i+1, p_vcdplayer->i_tracks );
+ return VLC_EGENERIC;
+ }
+
+ VCDSetOrigin(p_access,
+ vcdinfo_get_entry_lsn(p_vcdplayer->vcd, i_entry),
+ i_track, &itemid );
+ }
+ break;
+
+ case ACCESS_SET_SEEKPOINT:
+ {
+ input_title_t *t = p_vcdplayer->p_title[p_access->info.i_title];
+ unsigned int i = (unsigned int)va_arg( args, unsigned int );
+
+ dbg_print( INPUT_DBG_EVENT, "set seekpoint %d", i );
+ if( t->i_seekpoint > 0 )
+ {
+ track_t i_track = p_access->info.i_title+1;
+ lsn_t lsn;
+
+ /* FIXME! For now we are assuming titles are only
+ tracks and that track == title+1 and we the play
+ item is entries (not tracks or lids).
+ We need to generalize all of this.
+ */
+
+ if (i < p_vcdplayer->i_entries)
+ {
+ p_vcdplayer->play_item.num = i;
+ p_vcdplayer->play_item.type = VCDINFO_ITEM_TYPE_ENTRY;
+ lsn = vcdinfo_get_entry_lsn(p_vcdplayer->vcd, i);
+ } else if ( i < p_vcdplayer->i_entries + p_vcdplayer->i_lids )
+ {
+ p_vcdplayer->play_item.num = i
+ = i - p_vcdplayer->i_entries;
+ p_vcdplayer->play_item.type = VCDINFO_ITEM_TYPE_LID;
+ lsn = 0;
+ } else
+ {
+ p_vcdplayer->play_item.num = i
+ = i - p_vcdplayer->i_entries - p_vcdplayer->i_lids;
+ p_vcdplayer->play_item.type = VCDINFO_ITEM_TYPE_SEGMENT;
+ lsn = vcdinfo_get_seg_lsn(p_vcdplayer->vcd, i);
+ }
+
+ VCDSetOrigin( p_access,
+ vcdinfo_get_entry_lsn(p_vcdplayer->vcd, i),
+ i_track, &(p_vcdplayer->play_item) );
+ }
+ return VLC_SUCCESS;
+ }
+
+ case ACCESS_SET_PRIVATE_ID_STATE:
+ dbg_print( INPUT_DBG_EVENT, "set private id" );
+ return VLC_EGENERIC;
+
+ default:
+ msg_Warn( p_access, "unimplemented query in control" );
+ return VLC_EGENERIC;
+
+ }
+ return VLC_SUCCESS;