00001 /***************************************************************************** 00002 * cdda.h : CD-DA input module header for vlc using libcdio. 00003 ***************************************************************************** 00004 * Copyright (C) 2003 the VideoLAN team 00005 * $Id: cdda.h 12632 2005-09-21 02:15:03Z rocky $ 00006 * 00007 * Author: Rocky Bernstein <[email protected]> 00008 * 00009 * This program is free software; you can redistribute it and/or modify 00010 * it under the terms of the GNU General Public License as published by 00011 * the Free Software Foundation; either version 2 of the License, or 00012 * (at your option) any later version. 00013 * 00014 * This program is distributed in the hope that it will be useful, 00015 * but WITHOUT ANY WARRANTY; without even the implied warranty of 00016 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 00017 * GNU General Public License for more details. 00018 * 00019 * You should have received a copy of the GNU General Public License 00020 * along with this program; if not, write to the Free Software 00021 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111, USA. 00022 *****************************************************************************/ 00023 00024 #include <vlc/input.h> 00025 #include <cdio/cdio.h> 00026 #include <cdio/cdtext.h> 00027 #if LIBCDIO_VERSION_NUM >= 73 00028 #include <cdio/audio.h> 00029 #include <cdio/mmc.h> 00030 #endif 00031 00032 #include "vlc_meta.h" 00033 #include "codecs.h" 00034 00035 #ifdef HAVE_LIBCDDB 00036 #include <cddb/cddb.h> 00037 #endif 00038 00039 00040 #define CDDA_MRL_PREFIX "cddax://" 00041 00042 /* Frequency of sample in bits per second. */ 00043 #define CDDA_FREQUENCY_SAMPLE 44100 00044 00045 /***************************************************************************** 00046 * Debugging 00047 *****************************************************************************/ 00048 #define INPUT_DBG_META 1 /* Meta information */ 00049 #define INPUT_DBG_EVENT 2 /* Trace keyboard events */ 00050 #define INPUT_DBG_MRL 4 /* MRL debugging */ 00051 #define INPUT_DBG_EXT 8 /* Calls from external routines */ 00052 #define INPUT_DBG_CALL 16 /* all calls */ 00053 #define INPUT_DBG_LSN 32 /* LSN changes */ 00054 #define INPUT_DBG_SEEK 64 /* Seeks to set location */ 00055 #define INPUT_DBG_CDIO 128 /* Debugging from CDIO */ 00056 #define INPUT_DBG_CDDB 256 /* CDDB debugging */ 00057 00058 #define INPUT_DEBUG 1 00059 #if INPUT_DEBUG 00060 #define dbg_print(mask, s, args...) \ 00061 if (p_cdda->i_debug & mask) \ 00062 msg_Dbg(p_access, "%s: "s, __func__ , ##args) 00063 #else 00064 #define dbg_print(mask, s, args...) 00065 #endif 00066 00067 #if LIBCDIO_VERSION_NUM >= 72 00068 #include <cdio/cdda.h> 00069 #include <cdio/paranoia.h> 00070 #else 00071 #define CdIo_t CdIo 00072 #endif 00073 00074 typedef enum { 00075 paranoia_none = 0, /* Note: We make use of 0 as being the same as false */ 00076 paranoia_overlap = 1, 00077 paranoia_full = 2 00078 } paranoia_mode_t; 00079 00080 00081 /***************************************************************************** 00082 * cdda_data_t: CD audio information 00083 *****************************************************************************/ 00084 typedef struct cdda_data_s 00085 { 00086 CdIo_t *p_cdio; /* libcdio CD device */ 00087 track_t i_tracks; /* # of tracks */ 00088 track_t i_first_track; /* # of first track */ 00089 track_t i_titles; /* # of titles in playlist */ 00090 00091 /* Current position */ 00092 track_t i_track; /* Current track */ 00093 lsn_t i_lsn; /* Current Logical Sector Number */ 00094 00095 lsn_t first_frame; /* LSN of first frame of this track */ 00096 lsn_t last_frame; /* LSN of last frame of this track */ 00097 lsn_t last_disc_frame; /* LSN of last frame on CD */ 00098 int i_blocks_per_read; /* # blocks to get in a read */ 00099 int i_debug; /* Debugging mask */ 00100 00101 /* Information about CD */ 00102 vlc_meta_t *p_meta; 00103 char * psz_mcn; /* Media Catalog Number */ 00104 char * psz_source; /* CD drive or CD image filename */ 00105 input_title_t *p_title[CDIO_CD_MAX_TRACKS]; /* This *is* 0 origin, not 00106 track number origin */ 00107 00108 #if LIBCDIO_VERSION_NUM >= 72 00109 /* Paranoia support */ 00110 paranoia_mode_t e_paranoia; /* Use cd paranoia for reads? */ 00111 cdrom_drive_t *paranoia_cd; /* Place to store drive 00112 handle given by paranoia. */ 00113 cdrom_paranoia_t *paranoia; 00114 00115 #endif 00116 00117 #ifdef HAVE_LIBCDDB 00118 vlc_bool_t b_cddb_enabled; /* Use CDDB at all? */ 00119 struct { 00120 vlc_bool_t have_info; /* True if we have any info */ 00121 cddb_disc_t *disc; /* libcdio uses this to get disc 00122 info */ 00123 int disc_length; /* Length in frames of cd. Used 00124 in CDDB lookups */ 00125 } cddb; 00126 #endif 00127 00128 vlc_bool_t b_audio_ctl; /* Use CD-Text audio controls and 00129 audio output? */ 00130 00131 vlc_bool_t b_cdtext; /* Use CD-Text at all? If not, 00132 cdtext_preferred is meaningless. */ 00133 vlc_bool_t b_cdtext_prefer; /* Prefer CD-Text info over 00134 CDDB? If no CDDB, the issue 00135 is moot. */ 00136 00137 const cdtext_t *p_cdtext[CDIO_CD_MAX_TRACKS]; /* CD-Text info. Origin is NOT 00138 0 origin but origin of track 00139 number (usually 1). 00140 */ 00141 00142 WAVEHEADER waveheader; /* Wave header for the output data */ 00143 vlc_bool_t b_header; 00144 vlc_bool_t b_nav_mode; /* If false we view the entire CD as 00145 as a unit rather than each track 00146 as a unit. If b_nav_mode then the 00147 slider area represents the Disc rather 00148 than a track 00149 */ 00150 00151 input_thread_t *p_input; 00152 00153 } cdda_data_t; 00154 00155 /* FIXME: This variable is a hack. Would be nice to eliminate. */ 00156 extern access_t *p_cdda_input;