Mercurial > mplayer.hg
annotate stream/stream_cdda.c @ 28992:947ef23ba798
Test if create_vdp_decoder() might succeed by calling it from config()
with a small value for max_reference_frames.
This does not make automatic recovery by using software decoder possible,
but lets MPlayer fail more graciously on - actually existing - buggy
hardware that does not support certain H264 widths when using
hardware accelerated decoding (784, 864, 944, 1024, 1808, 1888 pixels on
NVIDIA G98) and if the user tries to hardware-decode more samples at
the same time than supported.
Might break playback of H264 Intra-Only samples on hardware with very
little video memory.
author | cehoyos |
---|---|
date | Sat, 21 Mar 2009 20:11:05 +0000 |
parents | 9e739bdb049c |
children | 0f1b5b68af32 |
rev | line source |
---|---|
6384
f0b933918a22
Support for playing audio cds using cdparanoia. Include a raw audio
albeu
parents:
diff
changeset
|
1 #include "config.h" |
f0b933918a22
Support for playing audio cds using cdparanoia. Include a raw audio
albeu
parents:
diff
changeset
|
2 |
21418
cc5b0c53b263
Move system headers before libavutil headers to work around build issues on
diego
parents:
21372
diff
changeset
|
3 #include <stdio.h> |
cc5b0c53b263
Move system headers before libavutil headers to work around build issues on
diego
parents:
21372
diff
changeset
|
4 #include <stdlib.h> |
cc5b0c53b263
Move system headers before libavutil headers to work around build issues on
diego
parents:
21372
diff
changeset
|
5 |
6384
f0b933918a22
Support for playing audio cds using cdparanoia. Include a raw audio
albeu
parents:
diff
changeset
|
6 #include "stream.h" |
17012 | 7 #include "m_option.h" |
8 #include "m_struct.h" | |
21372 | 9 #include "libavutil/common.h" |
21507
fa99b3d31d13
Hack around libavutil/bswap.h compilation problems due to always_inline undefined.
reimar
parents:
21479
diff
changeset
|
10 #include "mpbswap.h" |
19312
ab8d6b6deb63
proper inclusion of demuxer.h (including libmpdemux in Makefile only was to make previous split easier)
ben
parents:
19272
diff
changeset
|
11 #include "libmpdemux/demuxer.h" |
6384
f0b933918a22
Support for playing audio cds using cdparanoia. Include a raw audio
albeu
parents:
diff
changeset
|
12 |
6696 | 13 #include "cdd.h" |
6384
f0b933918a22
Support for playing audio cds using cdparanoia. Include a raw audio
albeu
parents:
diff
changeset
|
14 |
16967
32e2c59c8e86
[TRIVIAL] More translatables to help_mp and printfs to mp_msg on libmpdemux
reynaldo
parents:
16940
diff
changeset
|
15 #include "mp_msg.h" |
32e2c59c8e86
[TRIVIAL] More translatables to help_mp and printfs to mp_msg on libmpdemux
reynaldo
parents:
16940
diff
changeset
|
16 #include "help_mp.h" |
32e2c59c8e86
[TRIVIAL] More translatables to help_mp and printfs to mp_msg on libmpdemux
reynaldo
parents:
16940
diff
changeset
|
17 |
16940 | 18 #ifndef CD_FRAMESIZE_RAW |
19 #define CD_FRAMESIZE_RAW CDIO_CD_FRAMESIZE_RAW | |
20 #endif | |
21 | |
22 | |
10591 | 23 extern char *cdrom_device; |
24 | |
9801 | 25 static struct cdda_params { |
26 int speed; | |
27 int paranoia_mode; | |
28 char* generic_dev; | |
29 int sector_size; | |
30 int search_overlap; | |
31 int toc_bias; | |
32 int toc_offset; | |
33 int no_skip; | |
34 char* device; | |
35 m_span_t span; | |
36 } cdda_dflts = { | |
37 -1, | |
16914
701af802aee7
set cdda paranoia default to 0 since e.g. cdda://2 breaks otherwise.
reimar
parents:
16635
diff
changeset
|
38 0, |
9801 | 39 NULL, |
40 0, | |
41 -1, | |
42 0, | |
43 0, | |
44 0, | |
10591 | 45 NULL, |
9801 | 46 { 0, 0 } |
47 }; | |
6384
f0b933918a22
Support for playing audio cds using cdparanoia. Include a raw audio
albeu
parents:
diff
changeset
|
48 |
9801 | 49 #define ST_OFF(f) M_ST_OFF(struct cdda_params,f) |
25242 | 50 static const m_option_t cdda_params_fields[] = { |
9801 | 51 { "speed", ST_OFF(speed), CONF_TYPE_INT, M_OPT_RANGE,1,100, NULL }, |
52 { "paranoia", ST_OFF(paranoia_mode), CONF_TYPE_INT,M_OPT_RANGE, 0, 2, NULL }, | |
53 { "generic-dev", ST_OFF(generic_dev), CONF_TYPE_STRING, 0, 0, 0, NULL }, | |
54 { "sector-size", ST_OFF(sector_size), CONF_TYPE_INT, M_OPT_RANGE,1,100, NULL }, | |
55 { "overlap", ST_OFF(search_overlap), CONF_TYPE_INT, M_OPT_RANGE,0,75, NULL }, | |
56 { "toc-bias", ST_OFF(toc_bias), CONF_TYPE_INT, 0, 0, 0, NULL }, | |
57 { "toc-offset", ST_OFF(toc_offset), CONF_TYPE_INT, 0, 0, 0, NULL }, | |
58 { "noskip", ST_OFF(no_skip), CONF_TYPE_FLAG, 0 , 0, 1, NULL }, | |
59 { "skip", ST_OFF(no_skip), CONF_TYPE_FLAG, 0 , 1, 0, NULL }, | |
60 { "device", ST_OFF(device), CONF_TYPE_STRING, 0, 0, 0, NULL }, | |
61 { "span", ST_OFF(span), CONF_TYPE_OBJ_PARAMS, 0, 0, 0, &m_span_params_def }, | |
62 /// For url parsing | |
63 { "hostname", ST_OFF(span), CONF_TYPE_OBJ_PARAMS, 0, 0, 0, &m_span_params_def }, | |
64 { "port", ST_OFF(speed), CONF_TYPE_INT, M_OPT_RANGE,1,100, NULL }, | |
65 { "filename", ST_OFF(device), CONF_TYPE_STRING, 0, 0, 0, NULL }, | |
66 {NULL, NULL, 0, 0, 0, 0, NULL} | |
67 }; | |
25691 | 68 static const struct m_struct_st stream_opts = { |
9801 | 69 "cdda", |
70 sizeof(struct cdda_params), | |
71 &cdda_dflts, | |
72 cdda_params_fields | |
73 }; | |
74 | |
75 /// We keep these options but now they set the defaults | |
25241
bb7c65f2a289
Make m_option_t arrays referenced by cfg-common.h const
reimar
parents:
25211
diff
changeset
|
76 const m_option_t cdda_opts[] = { |
9801 | 77 { "speed", &cdda_dflts.speed, CONF_TYPE_INT, M_OPT_RANGE,1,100, NULL }, |
78 { "paranoia", &cdda_dflts.paranoia_mode, CONF_TYPE_INT,M_OPT_RANGE, 0, 2, NULL }, | |
79 { "generic-dev", &cdda_dflts.generic_dev, CONF_TYPE_STRING, 0, 0, 0, NULL }, | |
80 { "sector-size", &cdda_dflts.sector_size, CONF_TYPE_INT, M_OPT_RANGE,1,100, NULL }, | |
81 { "overlap", &cdda_dflts.search_overlap, CONF_TYPE_INT, M_OPT_RANGE,0,75, NULL }, | |
82 { "toc-bias", &cdda_dflts.toc_bias, CONF_TYPE_INT, 0, 0, 0, NULL }, | |
83 { "toc-offset", &cdda_dflts.toc_offset, CONF_TYPE_INT, 0, 0, 0, NULL }, | |
84 { "noskip", &cdda_dflts.no_skip, CONF_TYPE_FLAG, 0 , 0, 1, NULL }, | |
85 { "skip", &cdda_dflts.no_skip, CONF_TYPE_FLAG, 0 , 1, 0, NULL }, | |
86 { "device", &cdda_dflts.device, CONF_TYPE_STRING, 0, 0, 0, NULL }, | |
87 { "span", &cdda_dflts.span, CONF_TYPE_OBJ_PARAMS, 0, 0, 0, &m_span_params_def }, | |
6384
f0b933918a22
Support for playing audio cds using cdparanoia. Include a raw audio
albeu
parents:
diff
changeset
|
88 {NULL, NULL, 0, 0, 0, 0, NULL} |
f0b933918a22
Support for playing audio cds using cdparanoia. Include a raw audio
albeu
parents:
diff
changeset
|
89 }; |
f0b933918a22
Support for playing audio cds using cdparanoia. Include a raw audio
albeu
parents:
diff
changeset
|
90 |
28051 | 91 int cdd_identify(const char *dev); |
92 int cddb_resolve(const char *dev, char **xmcd_file); | |
93 cd_info_t* cddb_parse_xmcd(char *xmcd_file); | |
9801 | 94 |
95 static int seek(stream_t* s,off_t pos); | |
96 static int fill_buffer(stream_t* s, char* buffer, int max_len); | |
16935
60bd6aeed405
make it optionally possible to compile MPlayer with libcdio instead of libcdparanoia
faust3
parents:
16926
diff
changeset
|
97 static void close_cdda(stream_t* s); |
9801 | 98 |
25410 | 99 static int get_track_by_sector(cdda_priv *p, unsigned int sector) { |
100 int i; | |
101 for (i = p->cd->tracks; i >= 0 ; --i) | |
102 if (p->cd->disc_toc[i].dwStartSector <= sector) | |
103 break; | |
104 return i; | |
105 } | |
106 | |
107 static int control(stream_t *stream, int cmd, void *arg) { | |
108 cdda_priv* p = stream->priv; | |
109 switch(cmd) { | |
110 case STREAM_CTRL_GET_NUM_CHAPTERS: | |
111 { | |
112 int start_track = get_track_by_sector(p, p->start_sector); | |
113 int end_track = get_track_by_sector(p, p->end_sector); | |
114 *(unsigned int *)arg = end_track + 1 - start_track; | |
115 return STREAM_OK; | |
116 } | |
117 case STREAM_CTRL_SEEK_TO_CHAPTER: | |
118 { | |
119 int r; | |
120 unsigned int track = *(unsigned int *)arg; | |
121 int start_track = get_track_by_sector(p, p->start_sector); | |
122 int seek_sector; | |
123 track += start_track; | |
124 if (track >= p->cd->tracks) { | |
125 stream->eof = 1; | |
126 return STREAM_ERROR; | |
127 } | |
128 seek_sector = track <= 0 ? p->start_sector | |
129 : p->cd->disc_toc[track].dwStartSector; | |
130 r = seek(stream, seek_sector * CD_FRAMESIZE_RAW); | |
131 if (r) | |
132 return STREAM_OK; | |
133 break; | |
134 } | |
135 case STREAM_CTRL_GET_CURRENT_CHAPTER: | |
136 { | |
137 int start_track = get_track_by_sector(p, p->start_sector); | |
138 int cur_track = get_track_by_sector(p, p->sector); | |
139 *(unsigned int *)arg = cur_track - start_track; | |
140 return STREAM_OK; | |
141 } | |
142 } | |
143 return STREAM_UNSUPPORTED; | |
144 } | |
145 | |
9801 | 146 static int open_cdda(stream_t *st,int m, void* opts, int* file_format) { |
147 struct cdda_params* p = (struct cdda_params*)opts; | |
148 int mode = p->paranoia_mode; | |
149 int offset = p->toc_offset; | |
27391
1d2faa1020fb
Rename a bunch of miscellaneous preprocessor directives.
diego
parents:
25691
diff
changeset
|
150 #ifndef CONFIG_LIBCDIO |
6384
f0b933918a22
Support for playing audio cds using cdparanoia. Include a raw audio
albeu
parents:
diff
changeset
|
151 cdrom_drive* cdd = NULL; |
16935
60bd6aeed405
make it optionally possible to compile MPlayer with libcdio instead of libcdparanoia
faust3
parents:
16926
diff
changeset
|
152 #else |
60bd6aeed405
make it optionally possible to compile MPlayer with libcdio instead of libcdparanoia
faust3
parents:
16926
diff
changeset
|
153 cdrom_drive_t* cdd = NULL; |
60bd6aeed405
make it optionally possible to compile MPlayer with libcdio instead of libcdparanoia
faust3
parents:
16926
diff
changeset
|
154 #endif |
6384
f0b933918a22
Support for playing audio cds using cdparanoia. Include a raw audio
albeu
parents:
diff
changeset
|
155 cdda_priv* priv; |
9801 | 156 cd_info_t *cd_info,*cddb_info = NULL; |
6696 | 157 unsigned int audiolen=0; |
16926
24c52f2c3aa9
fix cdda://n syntax: do not hang when n > nr_tracks and play only track n,
reimar
parents:
16914
diff
changeset
|
158 int last_track; |
6696 | 159 int i; |
9801 | 160 char *xmcd_file = NULL; |
6384
f0b933918a22
Support for playing audio cds using cdparanoia. Include a raw audio
albeu
parents:
diff
changeset
|
161 |
9801 | 162 if(m != STREAM_READ) { |
163 m_struct_free(&stream_opts,opts); | |
24257 | 164 return STREAM_UNSUPPORTED; |
9801 | 165 } |
6384
f0b933918a22
Support for playing audio cds using cdparanoia. Include a raw audio
albeu
parents:
diff
changeset
|
166 |
10591 | 167 if(!p->device) { |
168 if (cdrom_device) | |
169 p->device = strdup(cdrom_device); | |
170 else | |
171 p->device = strdup(DEFAULT_CDROM_DEVICE); | |
172 } | |
173 | |
27391
1d2faa1020fb
Rename a bunch of miscellaneous preprocessor directives.
diego
parents:
25691
diff
changeset
|
174 #ifdef CONFIG_CDDB |
16524
83d101e1bedb
Prints the number of tracks and MSF length for each track of an audio CD,
gpoirier
parents:
11652
diff
changeset
|
175 // cdd_identify returns -1 if it cannot read the TOC, |
83d101e1bedb
Prints the number of tracks and MSF length for each track of an audio CD,
gpoirier
parents:
11652
diff
changeset
|
176 // in which case there is no point in calling cddb_resolve |
83d101e1bedb
Prints the number of tracks and MSF length for each track of an audio CD,
gpoirier
parents:
11652
diff
changeset
|
177 if(cdd_identify(p->device) >= 0 && strncmp(st->url,"cddb",4) == 0) { |
9801 | 178 i = cddb_resolve(p->device, &xmcd_file); |
179 if(i == 0) { | |
180 cddb_info = cddb_parse_xmcd(xmcd_file); | |
181 free(xmcd_file); | |
6384
f0b933918a22
Support for playing audio cds using cdparanoia. Include a raw audio
albeu
parents:
diff
changeset
|
182 } |
f0b933918a22
Support for playing audio cds using cdparanoia. Include a raw audio
albeu
parents:
diff
changeset
|
183 } |
9801 | 184 #endif |
185 | |
27391
1d2faa1020fb
Rename a bunch of miscellaneous preprocessor directives.
diego
parents:
25691
diff
changeset
|
186 #ifndef CONFIG_LIBCDIO |
9801 | 187 if(p->generic_dev) |
188 cdd = cdda_identify_scsi(p->generic_dev,p->device,0,NULL); | |
6384
f0b933918a22
Support for playing audio cds using cdparanoia. Include a raw audio
albeu
parents:
diff
changeset
|
189 else |
16935
60bd6aeed405
make it optionally possible to compile MPlayer with libcdio instead of libcdparanoia
faust3
parents:
16926
diff
changeset
|
190 #endif |
8958
56bf90cefb10
Removed the hardcoded /dev/cdrom for NetBSD and added an work around
bertrand
parents:
8609
diff
changeset
|
191 #if defined(__NetBSD__) |
9801 | 192 cdd = cdda_identify_scsi(p->device,p->device,0,NULL); |
8958
56bf90cefb10
Removed the hardcoded /dev/cdrom for NetBSD and added an work around
bertrand
parents:
8609
diff
changeset
|
193 #else |
9801 | 194 cdd = cdda_identify(p->device,0,NULL); |
8958
56bf90cefb10
Removed the hardcoded /dev/cdrom for NetBSD and added an work around
bertrand
parents:
8609
diff
changeset
|
195 #endif |
6384
f0b933918a22
Support for playing audio cds using cdparanoia. Include a raw audio
albeu
parents:
diff
changeset
|
196 |
f0b933918a22
Support for playing audio cds using cdparanoia. Include a raw audio
albeu
parents:
diff
changeset
|
197 if(!cdd) { |
16967
32e2c59c8e86
[TRIVIAL] More translatables to help_mp and printfs to mp_msg on libmpdemux
reynaldo
parents:
16940
diff
changeset
|
198 mp_msg(MSGT_OPEN,MSGL_ERR,MSGTR_MPDEMUX_CDDA_CantOpenCDDADevice); |
9801 | 199 m_struct_free(&stream_opts,opts); |
18225 | 200 free(cddb_info); |
9801 | 201 return STREAM_ERROR; |
6384
f0b933918a22
Support for playing audio cds using cdparanoia. Include a raw audio
albeu
parents:
diff
changeset
|
202 } |
f0b933918a22
Support for playing audio cds using cdparanoia. Include a raw audio
albeu
parents:
diff
changeset
|
203 |
f0b933918a22
Support for playing audio cds using cdparanoia. Include a raw audio
albeu
parents:
diff
changeset
|
204 cdda_verbose_set(cdd, CDDA_MESSAGE_FORGETIT, CDDA_MESSAGE_FORGETIT); |
f0b933918a22
Support for playing audio cds using cdparanoia. Include a raw audio
albeu
parents:
diff
changeset
|
205 |
9801 | 206 if(p->sector_size) { |
207 cdd->nsectors = p->sector_size; | |
27391
1d2faa1020fb
Rename a bunch of miscellaneous preprocessor directives.
diego
parents:
25691
diff
changeset
|
208 #ifndef CONFIG_LIBCDIO |
9801 | 209 cdd->bigbuff = p->sector_size * CD_FRAMESIZE_RAW; |
16935
60bd6aeed405
make it optionally possible to compile MPlayer with libcdio instead of libcdparanoia
faust3
parents:
16926
diff
changeset
|
210 #endif |
6384
f0b933918a22
Support for playing audio cds using cdparanoia. Include a raw audio
albeu
parents:
diff
changeset
|
211 } |
f0b933918a22
Support for playing audio cds using cdparanoia. Include a raw audio
albeu
parents:
diff
changeset
|
212 |
f0b933918a22
Support for playing audio cds using cdparanoia. Include a raw audio
albeu
parents:
diff
changeset
|
213 if(cdda_open(cdd) != 0) { |
16967
32e2c59c8e86
[TRIVIAL] More translatables to help_mp and printfs to mp_msg on libmpdemux
reynaldo
parents:
16940
diff
changeset
|
214 mp_msg(MSGT_OPEN,MSGL_ERR,MSGTR_MPDEMUX_CDDA_CantOpenDisc); |
6384
f0b933918a22
Support for playing audio cds using cdparanoia. Include a raw audio
albeu
parents:
diff
changeset
|
215 cdda_close(cdd); |
9801 | 216 m_struct_free(&stream_opts,opts); |
18225 | 217 free(cddb_info); |
9801 | 218 return STREAM_ERROR; |
6384
f0b933918a22
Support for playing audio cds using cdparanoia. Include a raw audio
albeu
parents:
diff
changeset
|
219 } |
f0b933918a22
Support for playing audio cds using cdparanoia. Include a raw audio
albeu
parents:
diff
changeset
|
220 |
6696 | 221 cd_info = cd_info_new(); |
16967
32e2c59c8e86
[TRIVIAL] More translatables to help_mp and printfs to mp_msg on libmpdemux
reynaldo
parents:
16940
diff
changeset
|
222 mp_msg(MSGT_OPEN,MSGL_INFO,MSGTR_MPDEMUX_CDDA_AudioCDFoundWithNTracks,cdda_tracks(cdd)); |
6696 | 223 for(i=0;i<cdd->tracks;i++) { |
224 char track_name[80]; | |
225 long sec=cdda_track_firstsector(cdd,i+1); | |
226 long off=cdda_track_lastsector(cdd,i+1)-sec+1; | |
227 | |
228 sprintf(track_name, "Track %d", i+1); | |
229 cd_info_add_track(cd_info, track_name, i+1, (unsigned int)(off/(60*75)), (unsigned int)((off/75)%60), (unsigned int)(off%75), sec, off ); | |
230 audiolen += off; | |
231 } | |
232 cd_info->min = (unsigned int)(audiolen/(60*75)); | |
233 cd_info->sec = (unsigned int)((audiolen/75)%60); | |
234 cd_info->msec = (unsigned int)(audiolen%75); | |
235 | |
19062
83c3afeab35d
drops casts from void * on malloc/calloc from libmpdemux code
reynaldo
parents:
18922
diff
changeset
|
236 priv = malloc(sizeof(cdda_priv)); |
6696 | 237 memset(priv, 0, sizeof(cdda_priv)); |
6384
f0b933918a22
Support for playing audio cds using cdparanoia. Include a raw audio
albeu
parents:
diff
changeset
|
238 priv->cd = cdd; |
6696 | 239 priv->cd_info = cd_info; |
6384
f0b933918a22
Support for playing audio cds using cdparanoia. Include a raw audio
albeu
parents:
diff
changeset
|
240 |
9801 | 241 if(p->toc_bias) |
6384
f0b933918a22
Support for playing audio cds using cdparanoia. Include a raw audio
albeu
parents:
diff
changeset
|
242 offset -= cdda_track_firstsector(cdd,1); |
f0b933918a22
Support for playing audio cds using cdparanoia. Include a raw audio
albeu
parents:
diff
changeset
|
243 |
f0b933918a22
Support for playing audio cds using cdparanoia. Include a raw audio
albeu
parents:
diff
changeset
|
244 if(offset) { |
f0b933918a22
Support for playing audio cds using cdparanoia. Include a raw audio
albeu
parents:
diff
changeset
|
245 int i; |
f0b933918a22
Support for playing audio cds using cdparanoia. Include a raw audio
albeu
parents:
diff
changeset
|
246 for(i = 0 ; i < cdd->tracks + 1 ; i++) |
f0b933918a22
Support for playing audio cds using cdparanoia. Include a raw audio
albeu
parents:
diff
changeset
|
247 cdd->disc_toc[i].dwStartSector += offset; |
f0b933918a22
Support for playing audio cds using cdparanoia. Include a raw audio
albeu
parents:
diff
changeset
|
248 } |
f0b933918a22
Support for playing audio cds using cdparanoia. Include a raw audio
albeu
parents:
diff
changeset
|
249 |
9801 | 250 if(p->speed) |
251 cdda_speed_set(cdd,p->speed); | |
6384
f0b933918a22
Support for playing audio cds using cdparanoia. Include a raw audio
albeu
parents:
diff
changeset
|
252 |
16926
24c52f2c3aa9
fix cdda://n syntax: do not hang when n > nr_tracks and play only track n,
reimar
parents:
16914
diff
changeset
|
253 last_track = cdda_tracks(cdd); |
24c52f2c3aa9
fix cdda://n syntax: do not hang when n > nr_tracks and play only track n,
reimar
parents:
16914
diff
changeset
|
254 if (p->span.start > last_track) p->span.start = last_track; |
24c52f2c3aa9
fix cdda://n syntax: do not hang when n > nr_tracks and play only track n,
reimar
parents:
16914
diff
changeset
|
255 if (p->span.end < p->span.start) p->span.end = p->span.start; |
24c52f2c3aa9
fix cdda://n syntax: do not hang when n > nr_tracks and play only track n,
reimar
parents:
16914
diff
changeset
|
256 if (p->span.end > last_track) p->span.end = last_track; |
9801 | 257 if(p->span.start) |
258 priv->start_sector = cdda_track_firstsector(cdd,p->span.start); | |
6384
f0b933918a22
Support for playing audio cds using cdparanoia. Include a raw audio
albeu
parents:
diff
changeset
|
259 else |
f0b933918a22
Support for playing audio cds using cdparanoia. Include a raw audio
albeu
parents:
diff
changeset
|
260 priv->start_sector = cdda_disc_firstsector(cdd); |
f0b933918a22
Support for playing audio cds using cdparanoia. Include a raw audio
albeu
parents:
diff
changeset
|
261 |
9801 | 262 if(p->span.end) { |
263 priv->end_sector = cdda_track_lastsector(cdd,p->span.end); | |
6384
f0b933918a22
Support for playing audio cds using cdparanoia. Include a raw audio
albeu
parents:
diff
changeset
|
264 } else |
f0b933918a22
Support for playing audio cds using cdparanoia. Include a raw audio
albeu
parents:
diff
changeset
|
265 priv->end_sector = cdda_disc_lastsector(cdd); |
f0b933918a22
Support for playing audio cds using cdparanoia. Include a raw audio
albeu
parents:
diff
changeset
|
266 |
f0b933918a22
Support for playing audio cds using cdparanoia. Include a raw audio
albeu
parents:
diff
changeset
|
267 priv->cdp = paranoia_init(cdd); |
f0b933918a22
Support for playing audio cds using cdparanoia. Include a raw audio
albeu
parents:
diff
changeset
|
268 if(priv->cdp == NULL) { |
f0b933918a22
Support for playing audio cds using cdparanoia. Include a raw audio
albeu
parents:
diff
changeset
|
269 cdda_close(cdd); |
f0b933918a22
Support for playing audio cds using cdparanoia. Include a raw audio
albeu
parents:
diff
changeset
|
270 free(priv); |
9801 | 271 cd_info_free(cd_info); |
272 m_struct_free(&stream_opts,opts); | |
18225 | 273 free(cddb_info); |
9801 | 274 return STREAM_ERROR; |
6384
f0b933918a22
Support for playing audio cds using cdparanoia. Include a raw audio
albeu
parents:
diff
changeset
|
275 } |
f0b933918a22
Support for playing audio cds using cdparanoia. Include a raw audio
albeu
parents:
diff
changeset
|
276 |
f0b933918a22
Support for playing audio cds using cdparanoia. Include a raw audio
albeu
parents:
diff
changeset
|
277 if(mode == 0) |
f0b933918a22
Support for playing audio cds using cdparanoia. Include a raw audio
albeu
parents:
diff
changeset
|
278 mode = PARANOIA_MODE_DISABLE; |
f0b933918a22
Support for playing audio cds using cdparanoia. Include a raw audio
albeu
parents:
diff
changeset
|
279 else if(mode == 1) |
f0b933918a22
Support for playing audio cds using cdparanoia. Include a raw audio
albeu
parents:
diff
changeset
|
280 mode = PARANOIA_MODE_OVERLAP; |
f0b933918a22
Support for playing audio cds using cdparanoia. Include a raw audio
albeu
parents:
diff
changeset
|
281 else |
f0b933918a22
Support for playing audio cds using cdparanoia. Include a raw audio
albeu
parents:
diff
changeset
|
282 mode = PARANOIA_MODE_FULL; |
f0b933918a22
Support for playing audio cds using cdparanoia. Include a raw audio
albeu
parents:
diff
changeset
|
283 |
9801 | 284 if(p->no_skip) |
6384
f0b933918a22
Support for playing audio cds using cdparanoia. Include a raw audio
albeu
parents:
diff
changeset
|
285 mode |= PARANOIA_MODE_NEVERSKIP; |
27391
1d2faa1020fb
Rename a bunch of miscellaneous preprocessor directives.
diego
parents:
25691
diff
changeset
|
286 #ifndef CONFIG_LIBCDIO |
16635
8fd80915d2a2
10l, forgotten call to paranoia_modeset to actually set the desired mode.
reimar
parents:
16524
diff
changeset
|
287 paranoia_modeset(cdd, mode); |
6384
f0b933918a22
Support for playing audio cds using cdparanoia. Include a raw audio
albeu
parents:
diff
changeset
|
288 |
9801 | 289 if(p->search_overlap >= 0) |
290 paranoia_overlapset(cdd,p->search_overlap); | |
16935
60bd6aeed405
make it optionally possible to compile MPlayer with libcdio instead of libcdparanoia
faust3
parents:
16926
diff
changeset
|
291 #else |
60bd6aeed405
make it optionally possible to compile MPlayer with libcdio instead of libcdparanoia
faust3
parents:
16926
diff
changeset
|
292 paranoia_modeset(priv->cdp, mode); |
60bd6aeed405
make it optionally possible to compile MPlayer with libcdio instead of libcdparanoia
faust3
parents:
16926
diff
changeset
|
293 |
60bd6aeed405
make it optionally possible to compile MPlayer with libcdio instead of libcdparanoia
faust3
parents:
16926
diff
changeset
|
294 if(p->search_overlap >= 0) |
60bd6aeed405
make it optionally possible to compile MPlayer with libcdio instead of libcdparanoia
faust3
parents:
16926
diff
changeset
|
295 paranoia_overlapset(priv->cdp,p->search_overlap); |
60bd6aeed405
make it optionally possible to compile MPlayer with libcdio instead of libcdparanoia
faust3
parents:
16926
diff
changeset
|
296 #endif |
6384
f0b933918a22
Support for playing audio cds using cdparanoia. Include a raw audio
albeu
parents:
diff
changeset
|
297 |
f0b933918a22
Support for playing audio cds using cdparanoia. Include a raw audio
albeu
parents:
diff
changeset
|
298 paranoia_seek(priv->cdp,priv->start_sector,SEEK_SET); |
f0b933918a22
Support for playing audio cds using cdparanoia. Include a raw audio
albeu
parents:
diff
changeset
|
299 priv->sector = priv->start_sector; |
f0b933918a22
Support for playing audio cds using cdparanoia. Include a raw audio
albeu
parents:
diff
changeset
|
300 |
27391
1d2faa1020fb
Rename a bunch of miscellaneous preprocessor directives.
diego
parents:
25691
diff
changeset
|
301 #ifdef CONFIG_CDDB |
9801 | 302 if(cddb_info) { |
303 cd_info_free(cd_info); | |
304 priv->cd_info = cddb_info; | |
305 cd_info_debug( cddb_info ); | |
306 } | |
307 #endif | |
308 | |
6384
f0b933918a22
Support for playing audio cds using cdparanoia. Include a raw audio
albeu
parents:
diff
changeset
|
309 st->priv = priv; |
f0b933918a22
Support for playing audio cds using cdparanoia. Include a raw audio
albeu
parents:
diff
changeset
|
310 st->start_pos = priv->start_sector*CD_FRAMESIZE_RAW; |
25382 | 311 st->end_pos = (priv->end_sector + 1) * CD_FRAMESIZE_RAW; |
9801 | 312 st->type = STREAMTYPE_CDDA; |
313 st->sector_size = CD_FRAMESIZE_RAW; | |
6384
f0b933918a22
Support for playing audio cds using cdparanoia. Include a raw audio
albeu
parents:
diff
changeset
|
314 |
9801 | 315 st->fill_buffer = fill_buffer; |
316 st->seek = seek; | |
25410 | 317 st->control = control; |
16935
60bd6aeed405
make it optionally possible to compile MPlayer with libcdio instead of libcdparanoia
faust3
parents:
16926
diff
changeset
|
318 st->close = close_cdda; |
9801 | 319 |
320 *file_format = DEMUXER_TYPE_RAWAUDIO; | |
321 | |
322 m_struct_free(&stream_opts,opts); | |
323 | |
324 return STREAM_OK; | |
6384
f0b933918a22
Support for playing audio cds using cdparanoia. Include a raw audio
albeu
parents:
diff
changeset
|
325 } |
f0b933918a22
Support for playing audio cds using cdparanoia. Include a raw audio
albeu
parents:
diff
changeset
|
326 |
27391
1d2faa1020fb
Rename a bunch of miscellaneous preprocessor directives.
diego
parents:
25691
diff
changeset
|
327 #ifndef CONFIG_LIBCDIO |
6384
f0b933918a22
Support for playing audio cds using cdparanoia. Include a raw audio
albeu
parents:
diff
changeset
|
328 static void cdparanoia_callback(long inpos, int function) { |
16935
60bd6aeed405
make it optionally possible to compile MPlayer with libcdio instead of libcdparanoia
faust3
parents:
16926
diff
changeset
|
329 #else |
60bd6aeed405
make it optionally possible to compile MPlayer with libcdio instead of libcdparanoia
faust3
parents:
16926
diff
changeset
|
330 static void cdparanoia_callback(long int inpos, paranoia_cb_mode_t function) { |
60bd6aeed405
make it optionally possible to compile MPlayer with libcdio instead of libcdparanoia
faust3
parents:
16926
diff
changeset
|
331 #endif |
6384
f0b933918a22
Support for playing audio cds using cdparanoia. Include a raw audio
albeu
parents:
diff
changeset
|
332 } |
f0b933918a22
Support for playing audio cds using cdparanoia. Include a raw audio
albeu
parents:
diff
changeset
|
333 |
9801 | 334 static int fill_buffer(stream_t* s, char* buffer, int max_len) { |
6384
f0b933918a22
Support for playing audio cds using cdparanoia. Include a raw audio
albeu
parents:
diff
changeset
|
335 cdda_priv* p = (cdda_priv*)s->priv; |
6696 | 336 cd_track_t *cd_track; |
6384
f0b933918a22
Support for playing audio cds using cdparanoia. Include a raw audio
albeu
parents:
diff
changeset
|
337 int16_t * buf; |
9801 | 338 int i; |
6384
f0b933918a22
Support for playing audio cds using cdparanoia. Include a raw audio
albeu
parents:
diff
changeset
|
339 |
25382 | 340 if((p->sector < p->start_sector) || (p->sector > p->end_sector)) { |
341 s->eof = 1; | |
342 return 0; | |
343 } | |
344 | |
6384
f0b933918a22
Support for playing audio cds using cdparanoia. Include a raw audio
albeu
parents:
diff
changeset
|
345 buf = paranoia_read(p->cdp,cdparanoia_callback); |
20195 | 346 if (!buf) |
347 return 0; | |
6384
f0b933918a22
Support for playing audio cds using cdparanoia. Include a raw audio
albeu
parents:
diff
changeset
|
348 |
11652 | 349 #ifdef WORDS_BIGENDIAN |
350 for(i=0;i<CD_FRAMESIZE_RAW/2;i++) | |
351 buf[i]=le2me_16(buf[i]); | |
352 #endif | |
353 | |
6384
f0b933918a22
Support for playing audio cds using cdparanoia. Include a raw audio
albeu
parents:
diff
changeset
|
354 p->sector++; |
9801 | 355 memcpy(buffer,buf,CD_FRAMESIZE_RAW); |
6384
f0b933918a22
Support for playing audio cds using cdparanoia. Include a raw audio
albeu
parents:
diff
changeset
|
356 |
6696 | 357 for(i=0;i<p->cd->tracks;i++){ |
358 if(p->cd->disc_toc[i].dwStartSector==p->sector-1) { | |
359 cd_track = cd_info_get_track(p->cd_info, i+1); | |
360 //printf("Track %d, sector=%d\n", i, p->sector-1); | |
361 if( cd_track!=NULL ) { | |
16524
83d101e1bedb
Prints the number of tracks and MSF length for each track of an audio CD,
gpoirier
parents:
11652
diff
changeset
|
362 mp_msg(MSGT_SEEK, MSGL_INFO, "\n%s\n", cd_track->name); |
18237
4231482179b6
Get ride of the several if(identify) messy lines and rearangment of some of the output, both patches by Kiriuja mplayer-patches AT en-directo_net, his changes are barely unrelated, nevertheless Im commiting them thogeter just for the sake of my mental healt, I had both patches already applied on my local three
reynaldo
parents:
18225
diff
changeset
|
363 mp_msg(MSGT_IDENTIFY, MSGL_INFO, "ID_CDDA_TRACK=%d\n", cd_track->track_nb); |
6696 | 364 } |
365 break; | |
366 } | |
367 } | |
368 | |
369 | |
6384
f0b933918a22
Support for playing audio cds using cdparanoia. Include a raw audio
albeu
parents:
diff
changeset
|
370 return CD_FRAMESIZE_RAW; |
f0b933918a22
Support for playing audio cds using cdparanoia. Include a raw audio
albeu
parents:
diff
changeset
|
371 } |
f0b933918a22
Support for playing audio cds using cdparanoia. Include a raw audio
albeu
parents:
diff
changeset
|
372 |
9801 | 373 static int seek(stream_t* s,off_t newpos) { |
6384
f0b933918a22
Support for playing audio cds using cdparanoia. Include a raw audio
albeu
parents:
diff
changeset
|
374 cdda_priv* p = (cdda_priv*)s->priv; |
6696 | 375 cd_track_t *cd_track; |
376 int sec; | |
377 int current_track=0, seeked_track=0; | |
25365
b57179296e5a
Only print one track info when exactly seeking to the beginning of a track.
ulion
parents:
25362
diff
changeset
|
378 int seek_to_track = 0; |
6696 | 379 int i; |
9656
ef5ae9f9c6e6
fixed trivial seeking bugs, patch by Krister Lagerstrom <krister@kmlager.com>
alex
parents:
8958
diff
changeset
|
380 |
9801 | 381 s->pos = newpos; |
25362
74fbb5173956
Fix stream cdda seeks to CD's end and hangs forever bug.
ulion
parents:
25242
diff
changeset
|
382 sec = s->pos/CD_FRAMESIZE_RAW; |
25382 | 383 if (s->pos < 0 || sec > p->end_sector) { |
9656
ef5ae9f9c6e6
fixed trivial seeking bugs, patch by Krister Lagerstrom <krister@kmlager.com>
alex
parents:
8958
diff
changeset
|
384 s->eof = 1; |
9801 | 385 return 0; |
9656
ef5ae9f9c6e6
fixed trivial seeking bugs, patch by Krister Lagerstrom <krister@kmlager.com>
alex
parents:
8958
diff
changeset
|
386 } |
6384
f0b933918a22
Support for playing audio cds using cdparanoia. Include a raw audio
albeu
parents:
diff
changeset
|
387 |
8524 | 388 //printf("pos: %d, sec: %d ## %d\n", (int)s->pos, (int)sec, CD_FRAMESIZE_RAW); |
389 //printf("sector: %d new: %d\n", p->sector, sec ); | |
6696 | 390 |
391 for(i=0;i<p->cd->tracks;i++){ | |
8559 | 392 // printf("trk #%d: %d .. %d\n",i,p->cd->disc_toc[i].dwStartSector,p->cd->disc_toc[i+1].dwStartSector); |
8524 | 393 if( p->sector>=p->cd->disc_toc[i].dwStartSector && p->sector<p->cd->disc_toc[i+1].dwStartSector ) { |
6696 | 394 current_track = i; |
395 } | |
8524 | 396 if( sec>=p->cd->disc_toc[i].dwStartSector && sec<p->cd->disc_toc[i+1].dwStartSector ) { |
6696 | 397 seeked_track = i; |
25365
b57179296e5a
Only print one track info when exactly seeking to the beginning of a track.
ulion
parents:
25362
diff
changeset
|
398 seek_to_track = sec == p->cd->disc_toc[i].dwStartSector; |
6696 | 399 } |
400 } | |
401 //printf("current: %d, seeked: %d\n", current_track, seeked_track); | |
25365
b57179296e5a
Only print one track info when exactly seeking to the beginning of a track.
ulion
parents:
25362
diff
changeset
|
402 if (current_track != seeked_track && !seek_to_track) { |
6696 | 403 //printf("Track %d, sector=%d\n", seeked_track, sec); |
404 cd_track = cd_info_get_track(p->cd_info, seeked_track+1); | |
405 if( cd_track!=NULL ) { | |
16524
83d101e1bedb
Prints the number of tracks and MSF length for each track of an audio CD,
gpoirier
parents:
11652
diff
changeset
|
406 mp_msg(MSGT_SEEK, MSGL_INFO, "\n%s\n", cd_track->name); |
18237
4231482179b6
Get ride of the several if(identify) messy lines and rearangment of some of the output, both patches by Kiriuja mplayer-patches AT en-directo_net, his changes are barely unrelated, nevertheless Im commiting them thogeter just for the sake of my mental healt, I had both patches already applied on my local three
reynaldo
parents:
18225
diff
changeset
|
407 mp_msg(MSGT_IDENTIFY, MSGL_INFO, "ID_CDDA_TRACK=%d\n", cd_track->track_nb); |
6696 | 408 } |
409 | |
410 } | |
8524 | 411 #if 0 |
6384
f0b933918a22
Support for playing audio cds using cdparanoia. Include a raw audio
albeu
parents:
diff
changeset
|
412 if(sec < p->start_sector) |
f0b933918a22
Support for playing audio cds using cdparanoia. Include a raw audio
albeu
parents:
diff
changeset
|
413 sec = p->start_sector; |
f0b933918a22
Support for playing audio cds using cdparanoia. Include a raw audio
albeu
parents:
diff
changeset
|
414 else if(sec > p->end_sector) |
f0b933918a22
Support for playing audio cds using cdparanoia. Include a raw audio
albeu
parents:
diff
changeset
|
415 sec = p->end_sector; |
8524 | 416 #endif |
6384
f0b933918a22
Support for playing audio cds using cdparanoia. Include a raw audio
albeu
parents:
diff
changeset
|
417 |
f0b933918a22
Support for playing audio cds using cdparanoia. Include a raw audio
albeu
parents:
diff
changeset
|
418 p->sector = sec; |
6696 | 419 // s->pos = sec*CD_FRAMESIZE_RAW; |
6384
f0b933918a22
Support for playing audio cds using cdparanoia. Include a raw audio
albeu
parents:
diff
changeset
|
420 |
8524 | 421 //printf("seek: %d, sec: %d\n", (int)s->pos, sec); |
6384
f0b933918a22
Support for playing audio cds using cdparanoia. Include a raw audio
albeu
parents:
diff
changeset
|
422 paranoia_seek(p->cdp,sec,SEEK_SET); |
9801 | 423 return 1; |
6384
f0b933918a22
Support for playing audio cds using cdparanoia. Include a raw audio
albeu
parents:
diff
changeset
|
424 } |
f0b933918a22
Support for playing audio cds using cdparanoia. Include a raw audio
albeu
parents:
diff
changeset
|
425 |
16935
60bd6aeed405
make it optionally possible to compile MPlayer with libcdio instead of libcdparanoia
faust3
parents:
16926
diff
changeset
|
426 static void close_cdda(stream_t* s) { |
6384
f0b933918a22
Support for playing audio cds using cdparanoia. Include a raw audio
albeu
parents:
diff
changeset
|
427 cdda_priv* p = (cdda_priv*)s->priv; |
f0b933918a22
Support for playing audio cds using cdparanoia. Include a raw audio
albeu
parents:
diff
changeset
|
428 paranoia_free(p->cdp); |
f0b933918a22
Support for playing audio cds using cdparanoia. Include a raw audio
albeu
parents:
diff
changeset
|
429 cdda_close(p->cd); |
9801 | 430 cd_info_free(p->cd_info); |
431 free(p); | |
6384
f0b933918a22
Support for playing audio cds using cdparanoia. Include a raw audio
albeu
parents:
diff
changeset
|
432 } |
f0b933918a22
Support for playing audio cds using cdparanoia. Include a raw audio
albeu
parents:
diff
changeset
|
433 |
25211 | 434 const stream_info_t stream_info_cdda = { |
9801 | 435 "CDDA", |
436 "cdda", | |
437 "Albeu", | |
438 "", | |
439 open_cdda, | |
21479 | 440 { "cdda", |
27391
1d2faa1020fb
Rename a bunch of miscellaneous preprocessor directives.
diego
parents:
25691
diff
changeset
|
441 #ifdef CONFIG_CDDB |
21479 | 442 "cddb", |
443 #endif | |
444 NULL }, | |
9801 | 445 &stream_opts, |
446 1 // Urls are an option string | |
447 }; |