+ case ACCESS_CAN_CONTROL_PACE:
+ {
+ bool *pb_bool = (bool*)va_arg( args, bool* );
+ *pb_bool = p_cdda->b_audio_ctl ? false : true;
+ dbg_print( INPUT_DBG_META, "can control pace? %d", *pb_bool);
+ return VLC_SUCCESS;
+ }
+
+ case ACCESS_CAN_FASTSEEK:
+ dbg_print( INPUT_DBG_META, "can fast seek?");
+ goto common;
+ case ACCESS_CAN_SEEK:
+ dbg_print( INPUT_DBG_META, "can seek?");
+ goto common;
+ case ACCESS_CAN_PAUSE:
+ dbg_print( INPUT_DBG_META, "can pause?");
+ common:
+ {
+ bool *pb_bool = (bool*)va_arg( args, bool* );
+ *pb_bool = true;
+ return VLC_SUCCESS;
+ }
+
+ /* */
+ case ACCESS_GET_MTU:
+ {
+ pi_int = (int*)va_arg( args, int * );
+ *pi_int = p_cdda-> i_blocks_per_read * CDIO_CD_FRAMESIZE_RAW;
+ dbg_print( INPUT_DBG_META, "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;
+ break;
+ }
+
+ case ACCESS_GET_TITLE_INFO:
+ {
+ input_title_t ***ppp_title =
+ (input_title_t***)va_arg( args, input_title_t*** );
+
+ pi_int = (int*)va_arg( args, int* );
+ *((int*)va_arg( args, int* )) = 1; /* Title offset */
+
+ dbg_print ( INPUT_DBG_EVENT,
+ "GET TITLE: i_tracks %d, i_tracks %d",
+ p_cdda->i_tracks, p_cdda->i_tracks );
+
+ CDDAMetaInfo( p_access, CDIO_INVALID_TRACK );
+
+ if( p_cdda->b_nav_mode)
+ {
+ char *psz_title = CDDAFormatTitle( p_access, p_cdda->i_track );
+ input_Control( p_cdda->p_input, INPUT_SET_NAME, psz_title );
+ free(psz_title);
+ }
+
+ /* Duplicate title info */
+ if( p_cdda->i_titles == 0 )
+ {
+ *pi_int = 0; ppp_title = NULL;
+ return VLC_SUCCESS;
+ }
+ *pi_int = p_cdda->i_titles;
+ *ppp_title = calloc(1, sizeof( input_title_t **)
+ * p_cdda->i_titles );
+
+ if (!*ppp_title)
+ return VLC_ENOMEM;
+
+ for( i = 0; i < p_cdda->i_titles; i++ )
+ {
+ if ( p_cdda->p_title[i] )
+ {
+ (*ppp_title)[i] =
+ vlc_input_title_Duplicate( p_cdda->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 )
+ {
+ const track_t i_track = p_cdda->i_first_track + i;
+ /* Update info */
+ p_access->info.i_title = i;
+ if( p_cdda->b_nav_mode)
+ {
+ lsn_t i_last_lsn;
+ char *psz_title = CDDAFormatTitle( p_access, i_track );
+ input_Control( p_cdda->p_input, INPUT_SET_NAME,
+ psz_title );
+ free( psz_title );
+ p_cdda->i_track = i_track;
+ i_last_lsn = cdio_get_track_lsn( p_cdda->p_cdio,
+ CDIO_CDROM_LEADOUT_TRACK );
+ if( CDIO_INVALID_LSN != i_last_lsn )
+ p_access->info.i_size = (int64_t) CDIO_CD_FRAMESIZE_RAW
+ * i_last_lsn ;
+ p_access->info.i_pos = (int64_t)
+ cdio_get_track_lsn( p_cdda->p_cdio, i_track )
+ * CDIO_CD_FRAMESIZE_RAW;
+ }
+ else
+ {
+ p_access->info.i_size = p_cdda->p_title[i]->i_size;
+ p_access->info.i_pos = 0;
+ }
+ p_access->info.i_update = INPUT_UPDATE_TITLE|INPUT_UPDATE_SIZE;
+
+ /* Next sector to read */
+ p_cdda->i_lsn = cdio_get_track_lsn( p_cdda->p_cdio, i_track );
+ }
+ break;
+ }
+
+ case ACCESS_SET_PAUSE_STATE:
+ dbg_print( INPUT_DBG_META, "Pause");
+ if( p_cdda->b_audio_ctl )
+ cdda_audio_pause( p_cdda->p_cdio );
+ break;
+
+ case ACCESS_SET_SEEKPOINT:
+ dbg_print( INPUT_DBG_META, "set seekpoint");
+ return VLC_EGENERIC;
+
+ case ACCESS_SET_PRIVATE_ID_STATE:
+ dbg_print( INPUT_DBG_META, "set private id state");
+ return VLC_EGENERIC;
+
+ default:
+ msg_Warn( p_access, "unimplemented query in control" );
+ return VLC_EGENERIC;
+
+ }
+ return VLC_SUCCESS;
+}
+
+/*****************************************************************************
+ CDDAInit:
+
+ Initialize information pertaining to the CD: the number of tracks,
+ first track number, LSNs for each track and the leadout. The leadout
+ information is stored after the last track. The LSN array is
+ 0-origin, same as p_access->info. Add first_track to get what track
+ number this is on the CD. Note: libcdio uses the real track number.
+
+ On input we assume p_cdda->p_cdio and p_cdda->i_track have been set.
+
+ We return the VLC-type status, e.g. VLC_SUCCESS, VLC_ENOMEM, etc.
+ *****************************************************************************/
+static int CDDAInit( access_t *p_access, cdda_data_t *p_cdda )
+{
+ discmode_t discmode = CDIO_DISC_MODE_NO_INFO;
+
+ p_cdda->i_tracks = cdio_get_num_tracks( p_cdda->p_cdio );
+ p_cdda->i_first_track = cdio_get_first_track_num( p_cdda->p_cdio );
+
+ discmode = cdio_get_discmode( p_cdda->p_cdio );
+ switch( discmode )
+ {
+ case CDIO_DISC_MODE_CD_DA:
+ case CDIO_DISC_MODE_CD_MIXED:
+ /* These are possible for CD-DA */
+ break;
+ default:
+ /* These are not possible for CD-DA */
+ msg_Err( p_access,
+ "Disc seems not to be CD-DA. libcdio reports it is %s",
+ discmode2str[discmode]
+ );
+ return VLC_EGENERIC;
+ }
+
+ /* Set reading start LSN. */
+ p_cdda->i_lsn = cdio_get_track_lsn(p_cdda->p_cdio, p_cdda->i_track);
+
+ return VLC_SUCCESS;