Mercurial > mplayer.hg
annotate stream/stream_cdda.c @ 34515:a9d2dcb0f435
Fix skin PNG read errors.
FFmpeg's PNG decoder no longer does transcoding, but returns 32 bpp
images in RGBA format.
Extend (and rename) the existing 24 bpp to 32 bpp conversion function
to do 32 bpp ARGB conversion as well.
author | ib |
---|---|
date | Fri, 27 Jan 2012 00:07:45 +0000 |
parents | bdc9f135ac26 |
children | b5abdfe9bc61 |
rev | line source |
---|---|
30426
ce0122361a39
Add license header to all files missing it in the stream subdirectory.
diego
parents:
29401
diff
changeset
|
1 /* |
ce0122361a39
Add license header to all files missing it in the stream subdirectory.
diego
parents:
29401
diff
changeset
|
2 * This file is part of MPlayer. |
ce0122361a39
Add license header to all files missing it in the stream subdirectory.
diego
parents:
29401
diff
changeset
|
3 * |
ce0122361a39
Add license header to all files missing it in the stream subdirectory.
diego
parents:
29401
diff
changeset
|
4 * MPlayer is free software; you can redistribute it and/or modify |
ce0122361a39
Add license header to all files missing it in the stream subdirectory.
diego
parents:
29401
diff
changeset
|
5 * it under the terms of the GNU General Public License as published by |
ce0122361a39
Add license header to all files missing it in the stream subdirectory.
diego
parents:
29401
diff
changeset
|
6 * the Free Software Foundation; either version 2 of the License, or |
ce0122361a39
Add license header to all files missing it in the stream subdirectory.
diego
parents:
29401
diff
changeset
|
7 * (at your option) any later version. |
ce0122361a39
Add license header to all files missing it in the stream subdirectory.
diego
parents:
29401
diff
changeset
|
8 * |
ce0122361a39
Add license header to all files missing it in the stream subdirectory.
diego
parents:
29401
diff
changeset
|
9 * MPlayer is distributed in the hope that it will be useful, |
ce0122361a39
Add license header to all files missing it in the stream subdirectory.
diego
parents:
29401
diff
changeset
|
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of |
ce0122361a39
Add license header to all files missing it in the stream subdirectory.
diego
parents:
29401
diff
changeset
|
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
ce0122361a39
Add license header to all files missing it in the stream subdirectory.
diego
parents:
29401
diff
changeset
|
12 * GNU General Public License for more details. |
ce0122361a39
Add license header to all files missing it in the stream subdirectory.
diego
parents:
29401
diff
changeset
|
13 * |
ce0122361a39
Add license header to all files missing it in the stream subdirectory.
diego
parents:
29401
diff
changeset
|
14 * You should have received a copy of the GNU General Public License along |
ce0122361a39
Add license header to all files missing it in the stream subdirectory.
diego
parents:
29401
diff
changeset
|
15 * with MPlayer; if not, write to the Free Software Foundation, Inc., |
ce0122361a39
Add license header to all files missing it in the stream subdirectory.
diego
parents:
29401
diff
changeset
|
16 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. |
ce0122361a39
Add license header to all files missing it in the stream subdirectory.
diego
parents:
29401
diff
changeset
|
17 */ |
ce0122361a39
Add license header to all files missing it in the stream subdirectory.
diego
parents:
29401
diff
changeset
|
18 |
6384
f0b933918a22
Support for playing audio cds using cdparanoia. Include a raw audio
albeu
parents:
diff
changeset
|
19 #include "config.h" |
31440
01340407202e
Move cdda_priv structure to the only place it is used.
diego
parents:
31433
diff
changeset
|
20 #ifndef CONFIG_LIBCDIO |
01340407202e
Move cdda_priv structure to the only place it is used.
diego
parents:
31433
diff
changeset
|
21 #include <cdda_interface.h> |
01340407202e
Move cdda_priv structure to the only place it is used.
diego
parents:
31433
diff
changeset
|
22 #include <cdda_paranoia.h> |
01340407202e
Move cdda_priv structure to the only place it is used.
diego
parents:
31433
diff
changeset
|
23 #else |
01340407202e
Move cdda_priv structure to the only place it is used.
diego
parents:
31433
diff
changeset
|
24 #include <cdio/cdda.h> |
01340407202e
Move cdda_priv structure to the only place it is used.
diego
parents:
31433
diff
changeset
|
25 #include <cdio/paranoia.h> |
01340407202e
Move cdda_priv structure to the only place it is used.
diego
parents:
31433
diff
changeset
|
26 #endif |
21418
cc5b0c53b263
Move system headers before libavutil headers to work around build issues on
diego
parents:
21372
diff
changeset
|
27 #include <stdio.h> |
cc5b0c53b263
Move system headers before libavutil headers to work around build issues on
diego
parents:
21372
diff
changeset
|
28 #include <stdlib.h> |
cc5b0c53b263
Move system headers before libavutil headers to work around build issues on
diego
parents:
21372
diff
changeset
|
29 |
6384
f0b933918a22
Support for playing audio cds using cdparanoia. Include a raw audio
albeu
parents:
diff
changeset
|
30 #include "stream.h" |
17012 | 31 #include "m_option.h" |
32 #include "m_struct.h" | |
21372 | 33 #include "libavutil/common.h" |
21507
fa99b3d31d13
Hack around libavutil/bswap.h compilation problems due to always_inline undefined.
reimar
parents:
21479
diff
changeset
|
34 #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
|
35 #include "libmpdemux/demuxer.h" |
6384
f0b933918a22
Support for playing audio cds using cdparanoia. Include a raw audio
albeu
parents:
diff
changeset
|
36 |
6696 | 37 #include "cdd.h" |
6384
f0b933918a22
Support for playing audio cds using cdparanoia. Include a raw audio
albeu
parents:
diff
changeset
|
38 |
16967
32e2c59c8e86
[TRIVIAL] More translatables to help_mp and printfs to mp_msg on libmpdemux
reynaldo
parents:
16940
diff
changeset
|
39 #include "mp_msg.h" |
32e2c59c8e86
[TRIVIAL] More translatables to help_mp and printfs to mp_msg on libmpdemux
reynaldo
parents:
16940
diff
changeset
|
40 #include "help_mp.h" |
32e2c59c8e86
[TRIVIAL] More translatables to help_mp and printfs to mp_msg on libmpdemux
reynaldo
parents:
16940
diff
changeset
|
41 |
16940 | 42 #ifndef CD_FRAMESIZE_RAW |
43 #define CD_FRAMESIZE_RAW CDIO_CD_FRAMESIZE_RAW | |
44 #endif | |
45 | |
46 | |
31440
01340407202e
Move cdda_priv structure to the only place it is used.
diego
parents:
31433
diff
changeset
|
47 typedef struct { |
01340407202e
Move cdda_priv structure to the only place it is used.
diego
parents:
31433
diff
changeset
|
48 #ifndef CONFIG_LIBCDIO |
01340407202e
Move cdda_priv structure to the only place it is used.
diego
parents:
31433
diff
changeset
|
49 cdrom_drive* cd; |
01340407202e
Move cdda_priv structure to the only place it is used.
diego
parents:
31433
diff
changeset
|
50 cdrom_paranoia* cdp; |
01340407202e
Move cdda_priv structure to the only place it is used.
diego
parents:
31433
diff
changeset
|
51 #else |
01340407202e
Move cdda_priv structure to the only place it is used.
diego
parents:
31433
diff
changeset
|
52 cdrom_drive_t* cd; |
01340407202e
Move cdda_priv structure to the only place it is used.
diego
parents:
31433
diff
changeset
|
53 cdrom_paranoia_t* cdp; |
01340407202e
Move cdda_priv structure to the only place it is used.
diego
parents:
31433
diff
changeset
|
54 #endif |
01340407202e
Move cdda_priv structure to the only place it is used.
diego
parents:
31433
diff
changeset
|
55 int sector; |
01340407202e
Move cdda_priv structure to the only place it is used.
diego
parents:
31433
diff
changeset
|
56 int start_sector; |
01340407202e
Move cdda_priv structure to the only place it is used.
diego
parents:
31433
diff
changeset
|
57 int end_sector; |
01340407202e
Move cdda_priv structure to the only place it is used.
diego
parents:
31433
diff
changeset
|
58 cd_info_t *cd_info; |
01340407202e
Move cdda_priv structure to the only place it is used.
diego
parents:
31433
diff
changeset
|
59 } cdda_priv; |
01340407202e
Move cdda_priv structure to the only place it is used.
diego
parents:
31433
diff
changeset
|
60 |
9801 | 61 static struct cdda_params { |
62 int speed; | |
63 int paranoia_mode; | |
64 char* generic_dev; | |
65 int sector_size; | |
66 int search_overlap; | |
67 int toc_bias; | |
68 int toc_offset; | |
69 int no_skip; | |
70 char* device; | |
71 m_span_t span; | |
72 } cdda_dflts = { | |
34370
a958ea863ee1
Fix cdda speed default value, range and use more robust condition.
reimar
parents:
33469
diff
changeset
|
73 0, |
16914
701af802aee7
set cdda paranoia default to 0 since e.g. cdda://2 breaks otherwise.
reimar
parents:
16635
diff
changeset
|
74 0, |
9801 | 75 NULL, |
76 0, | |
77 -1, | |
78 0, | |
79 0, | |
80 0, | |
10591 | 81 NULL, |
9801 | 82 { 0, 0 } |
83 }; | |
6384
f0b933918a22
Support for playing audio cds using cdparanoia. Include a raw audio
albeu
parents:
diff
changeset
|
84 |
9801 | 85 #define ST_OFF(f) M_ST_OFF(struct cdda_params,f) |
25242 | 86 static const m_option_t cdda_params_fields[] = { |
34370
a958ea863ee1
Fix cdda speed default value, range and use more robust condition.
reimar
parents:
33469
diff
changeset
|
87 { "speed", ST_OFF(speed), CONF_TYPE_INT, M_OPT_RANGE,0,100, NULL }, |
9801 | 88 { "paranoia", ST_OFF(paranoia_mode), CONF_TYPE_INT,M_OPT_RANGE, 0, 2, NULL }, |
89 { "generic-dev", ST_OFF(generic_dev), CONF_TYPE_STRING, 0, 0, 0, NULL }, | |
90 { "sector-size", ST_OFF(sector_size), CONF_TYPE_INT, M_OPT_RANGE,1,100, NULL }, | |
34371
a4dd7151526b
Do not call paranoia_overlapset with 0, it actually causes cdparanoia to just hang.
reimar
parents:
34370
diff
changeset
|
91 { "overlap", ST_OFF(search_overlap), CONF_TYPE_INT, M_OPT_RANGE,-1,75, NULL }, |
9801 | 92 { "toc-bias", ST_OFF(toc_bias), CONF_TYPE_INT, 0, 0, 0, NULL }, |
93 { "toc-offset", ST_OFF(toc_offset), CONF_TYPE_INT, 0, 0, 0, NULL }, | |
94 { "noskip", ST_OFF(no_skip), CONF_TYPE_FLAG, 0 , 0, 1, NULL }, | |
95 { "skip", ST_OFF(no_skip), CONF_TYPE_FLAG, 0 , 1, 0, NULL }, | |
96 { "device", ST_OFF(device), CONF_TYPE_STRING, 0, 0, 0, NULL }, | |
97 { "span", ST_OFF(span), CONF_TYPE_OBJ_PARAMS, 0, 0, 0, &m_span_params_def }, | |
98 /// For url parsing | |
99 { "hostname", ST_OFF(span), CONF_TYPE_OBJ_PARAMS, 0, 0, 0, &m_span_params_def }, | |
100 { "port", ST_OFF(speed), CONF_TYPE_INT, M_OPT_RANGE,1,100, NULL }, | |
101 { "filename", ST_OFF(device), CONF_TYPE_STRING, 0, 0, 0, NULL }, | |
102 {NULL, NULL, 0, 0, 0, 0, NULL} | |
103 }; | |
25691 | 104 static const struct m_struct_st stream_opts = { |
9801 | 105 "cdda", |
106 sizeof(struct cdda_params), | |
107 &cdda_dflts, | |
108 cdda_params_fields | |
109 }; | |
110 | |
111 /// 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
|
112 const m_option_t cdda_opts[] = { |
9801 | 113 { "speed", &cdda_dflts.speed, CONF_TYPE_INT, M_OPT_RANGE,1,100, NULL }, |
114 { "paranoia", &cdda_dflts.paranoia_mode, CONF_TYPE_INT,M_OPT_RANGE, 0, 2, NULL }, | |
115 { "generic-dev", &cdda_dflts.generic_dev, CONF_TYPE_STRING, 0, 0, 0, NULL }, | |
116 { "sector-size", &cdda_dflts.sector_size, CONF_TYPE_INT, M_OPT_RANGE,1,100, NULL }, | |
117 { "overlap", &cdda_dflts.search_overlap, CONF_TYPE_INT, M_OPT_RANGE,0,75, NULL }, | |
118 { "toc-bias", &cdda_dflts.toc_bias, CONF_TYPE_INT, 0, 0, 0, NULL }, | |
119 { "toc-offset", &cdda_dflts.toc_offset, CONF_TYPE_INT, 0, 0, 0, NULL }, | |
120 { "noskip", &cdda_dflts.no_skip, CONF_TYPE_FLAG, 0 , 0, 1, NULL }, | |
121 { "skip", &cdda_dflts.no_skip, CONF_TYPE_FLAG, 0 , 1, 0, NULL }, | |
122 { "device", &cdda_dflts.device, CONF_TYPE_STRING, 0, 0, 0, NULL }, | |
123 { "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
|
124 {NULL, NULL, 0, 0, 0, 0, NULL} |
f0b933918a22
Support for playing audio cds using cdparanoia. Include a raw audio
albeu
parents:
diff
changeset
|
125 }; |
f0b933918a22
Support for playing audio cds using cdparanoia. Include a raw audio
albeu
parents:
diff
changeset
|
126 |
31445
872a1ef8b43b
cosmetics: Reorder functions to avoid forward declarations.
diego
parents:
31443
diff
changeset
|
127 #ifndef CONFIG_LIBCDIO |
872a1ef8b43b
cosmetics: Reorder functions to avoid forward declarations.
diego
parents:
31443
diff
changeset
|
128 static void cdparanoia_callback(long inpos, int function) { |
872a1ef8b43b
cosmetics: Reorder functions to avoid forward declarations.
diego
parents:
31443
diff
changeset
|
129 #else |
872a1ef8b43b
cosmetics: Reorder functions to avoid forward declarations.
diego
parents:
31443
diff
changeset
|
130 static void cdparanoia_callback(long int inpos, paranoia_cb_mode_t function) { |
872a1ef8b43b
cosmetics: Reorder functions to avoid forward declarations.
diego
parents:
31443
diff
changeset
|
131 #endif |
872a1ef8b43b
cosmetics: Reorder functions to avoid forward declarations.
diego
parents:
31443
diff
changeset
|
132 } |
872a1ef8b43b
cosmetics: Reorder functions to avoid forward declarations.
diego
parents:
31443
diff
changeset
|
133 |
872a1ef8b43b
cosmetics: Reorder functions to avoid forward declarations.
diego
parents:
31443
diff
changeset
|
134 static int fill_buffer(stream_t* s, char* buffer, int max_len) { |
872a1ef8b43b
cosmetics: Reorder functions to avoid forward declarations.
diego
parents:
31443
diff
changeset
|
135 cdda_priv* p = (cdda_priv*)s->priv; |
872a1ef8b43b
cosmetics: Reorder functions to avoid forward declarations.
diego
parents:
31443
diff
changeset
|
136 cd_track_t *cd_track; |
872a1ef8b43b
cosmetics: Reorder functions to avoid forward declarations.
diego
parents:
31443
diff
changeset
|
137 int16_t * buf; |
872a1ef8b43b
cosmetics: Reorder functions to avoid forward declarations.
diego
parents:
31443
diff
changeset
|
138 int i; |
872a1ef8b43b
cosmetics: Reorder functions to avoid forward declarations.
diego
parents:
31443
diff
changeset
|
139 |
872a1ef8b43b
cosmetics: Reorder functions to avoid forward declarations.
diego
parents:
31443
diff
changeset
|
140 if((p->sector < p->start_sector) || (p->sector > p->end_sector)) { |
872a1ef8b43b
cosmetics: Reorder functions to avoid forward declarations.
diego
parents:
31443
diff
changeset
|
141 s->eof = 1; |
872a1ef8b43b
cosmetics: Reorder functions to avoid forward declarations.
diego
parents:
31443
diff
changeset
|
142 return 0; |
872a1ef8b43b
cosmetics: Reorder functions to avoid forward declarations.
diego
parents:
31443
diff
changeset
|
143 } |
872a1ef8b43b
cosmetics: Reorder functions to avoid forward declarations.
diego
parents:
31443
diff
changeset
|
144 |
872a1ef8b43b
cosmetics: Reorder functions to avoid forward declarations.
diego
parents:
31443
diff
changeset
|
145 buf = paranoia_read(p->cdp,cdparanoia_callback); |
872a1ef8b43b
cosmetics: Reorder functions to avoid forward declarations.
diego
parents:
31443
diff
changeset
|
146 if (!buf) |
872a1ef8b43b
cosmetics: Reorder functions to avoid forward declarations.
diego
parents:
31443
diff
changeset
|
147 return 0; |
872a1ef8b43b
cosmetics: Reorder functions to avoid forward declarations.
diego
parents:
31443
diff
changeset
|
148 |
872a1ef8b43b
cosmetics: Reorder functions to avoid forward declarations.
diego
parents:
31443
diff
changeset
|
149 #if HAVE_BIGENDIAN |
872a1ef8b43b
cosmetics: Reorder functions to avoid forward declarations.
diego
parents:
31443
diff
changeset
|
150 for(i=0;i<CD_FRAMESIZE_RAW/2;i++) |
872a1ef8b43b
cosmetics: Reorder functions to avoid forward declarations.
diego
parents:
31443
diff
changeset
|
151 buf[i]=le2me_16(buf[i]); |
872a1ef8b43b
cosmetics: Reorder functions to avoid forward declarations.
diego
parents:
31443
diff
changeset
|
152 #endif |
872a1ef8b43b
cosmetics: Reorder functions to avoid forward declarations.
diego
parents:
31443
diff
changeset
|
153 |
872a1ef8b43b
cosmetics: Reorder functions to avoid forward declarations.
diego
parents:
31443
diff
changeset
|
154 p->sector++; |
872a1ef8b43b
cosmetics: Reorder functions to avoid forward declarations.
diego
parents:
31443
diff
changeset
|
155 memcpy(buffer,buf,CD_FRAMESIZE_RAW); |
872a1ef8b43b
cosmetics: Reorder functions to avoid forward declarations.
diego
parents:
31443
diff
changeset
|
156 |
872a1ef8b43b
cosmetics: Reorder functions to avoid forward declarations.
diego
parents:
31443
diff
changeset
|
157 for(i=0;i<p->cd->tracks;i++){ |
872a1ef8b43b
cosmetics: Reorder functions to avoid forward declarations.
diego
parents:
31443
diff
changeset
|
158 if(p->cd->disc_toc[i].dwStartSector==p->sector-1) { |
872a1ef8b43b
cosmetics: Reorder functions to avoid forward declarations.
diego
parents:
31443
diff
changeset
|
159 cd_track = cd_info_get_track(p->cd_info, i+1); |
872a1ef8b43b
cosmetics: Reorder functions to avoid forward declarations.
diego
parents:
31443
diff
changeset
|
160 //printf("Track %d, sector=%d\n", i, p->sector-1); |
872a1ef8b43b
cosmetics: Reorder functions to avoid forward declarations.
diego
parents:
31443
diff
changeset
|
161 if( cd_track!=NULL ) { |
872a1ef8b43b
cosmetics: Reorder functions to avoid forward declarations.
diego
parents:
31443
diff
changeset
|
162 mp_msg(MSGT_SEEK, MSGL_INFO, "\n%s\n", cd_track->name); |
872a1ef8b43b
cosmetics: Reorder functions to avoid forward declarations.
diego
parents:
31443
diff
changeset
|
163 mp_msg(MSGT_IDENTIFY, MSGL_INFO, "ID_CDDA_TRACK=%d\n", cd_track->track_nb); |
872a1ef8b43b
cosmetics: Reorder functions to avoid forward declarations.
diego
parents:
31443
diff
changeset
|
164 } |
872a1ef8b43b
cosmetics: Reorder functions to avoid forward declarations.
diego
parents:
31443
diff
changeset
|
165 break; |
872a1ef8b43b
cosmetics: Reorder functions to avoid forward declarations.
diego
parents:
31443
diff
changeset
|
166 } |
872a1ef8b43b
cosmetics: Reorder functions to avoid forward declarations.
diego
parents:
31443
diff
changeset
|
167 } |
872a1ef8b43b
cosmetics: Reorder functions to avoid forward declarations.
diego
parents:
31443
diff
changeset
|
168 |
872a1ef8b43b
cosmetics: Reorder functions to avoid forward declarations.
diego
parents:
31443
diff
changeset
|
169 |
872a1ef8b43b
cosmetics: Reorder functions to avoid forward declarations.
diego
parents:
31443
diff
changeset
|
170 return CD_FRAMESIZE_RAW; |
872a1ef8b43b
cosmetics: Reorder functions to avoid forward declarations.
diego
parents:
31443
diff
changeset
|
171 } |
872a1ef8b43b
cosmetics: Reorder functions to avoid forward declarations.
diego
parents:
31443
diff
changeset
|
172 |
872a1ef8b43b
cosmetics: Reorder functions to avoid forward declarations.
diego
parents:
31443
diff
changeset
|
173 static int seek(stream_t* s,off_t newpos) { |
872a1ef8b43b
cosmetics: Reorder functions to avoid forward declarations.
diego
parents:
31443
diff
changeset
|
174 cdda_priv* p = (cdda_priv*)s->priv; |
872a1ef8b43b
cosmetics: Reorder functions to avoid forward declarations.
diego
parents:
31443
diff
changeset
|
175 cd_track_t *cd_track; |
872a1ef8b43b
cosmetics: Reorder functions to avoid forward declarations.
diego
parents:
31443
diff
changeset
|
176 int sec; |
872a1ef8b43b
cosmetics: Reorder functions to avoid forward declarations.
diego
parents:
31443
diff
changeset
|
177 int current_track=0, seeked_track=0; |
872a1ef8b43b
cosmetics: Reorder functions to avoid forward declarations.
diego
parents:
31443
diff
changeset
|
178 int seek_to_track = 0; |
872a1ef8b43b
cosmetics: Reorder functions to avoid forward declarations.
diego
parents:
31443
diff
changeset
|
179 int i; |
872a1ef8b43b
cosmetics: Reorder functions to avoid forward declarations.
diego
parents:
31443
diff
changeset
|
180 |
872a1ef8b43b
cosmetics: Reorder functions to avoid forward declarations.
diego
parents:
31443
diff
changeset
|
181 s->pos = newpos; |
872a1ef8b43b
cosmetics: Reorder functions to avoid forward declarations.
diego
parents:
31443
diff
changeset
|
182 sec = s->pos/CD_FRAMESIZE_RAW; |
872a1ef8b43b
cosmetics: Reorder functions to avoid forward declarations.
diego
parents:
31443
diff
changeset
|
183 if (s->pos < 0 || sec > p->end_sector) { |
872a1ef8b43b
cosmetics: Reorder functions to avoid forward declarations.
diego
parents:
31443
diff
changeset
|
184 s->eof = 1; |
34374
09f2662d11cb
cdda: set position to an actual EOF position when we set EOF.
reimar
parents:
34372
diff
changeset
|
185 p->sector = p->end_sector + 1; |
31445
872a1ef8b43b
cosmetics: Reorder functions to avoid forward declarations.
diego
parents:
31443
diff
changeset
|
186 return 0; |
872a1ef8b43b
cosmetics: Reorder functions to avoid forward declarations.
diego
parents:
31443
diff
changeset
|
187 } |
872a1ef8b43b
cosmetics: Reorder functions to avoid forward declarations.
diego
parents:
31443
diff
changeset
|
188 |
872a1ef8b43b
cosmetics: Reorder functions to avoid forward declarations.
diego
parents:
31443
diff
changeset
|
189 //printf("pos: %d, sec: %d ## %d\n", (int)s->pos, (int)sec, CD_FRAMESIZE_RAW); |
872a1ef8b43b
cosmetics: Reorder functions to avoid forward declarations.
diego
parents:
31443
diff
changeset
|
190 //printf("sector: %d new: %d\n", p->sector, sec ); |
872a1ef8b43b
cosmetics: Reorder functions to avoid forward declarations.
diego
parents:
31443
diff
changeset
|
191 |
872a1ef8b43b
cosmetics: Reorder functions to avoid forward declarations.
diego
parents:
31443
diff
changeset
|
192 for(i=0;i<p->cd->tracks;i++){ |
872a1ef8b43b
cosmetics: Reorder functions to avoid forward declarations.
diego
parents:
31443
diff
changeset
|
193 // printf("trk #%d: %d .. %d\n",i,p->cd->disc_toc[i].dwStartSector,p->cd->disc_toc[i+1].dwStartSector); |
872a1ef8b43b
cosmetics: Reorder functions to avoid forward declarations.
diego
parents:
31443
diff
changeset
|
194 if( p->sector>=p->cd->disc_toc[i].dwStartSector && p->sector<p->cd->disc_toc[i+1].dwStartSector ) { |
872a1ef8b43b
cosmetics: Reorder functions to avoid forward declarations.
diego
parents:
31443
diff
changeset
|
195 current_track = i; |
872a1ef8b43b
cosmetics: Reorder functions to avoid forward declarations.
diego
parents:
31443
diff
changeset
|
196 } |
872a1ef8b43b
cosmetics: Reorder functions to avoid forward declarations.
diego
parents:
31443
diff
changeset
|
197 if( sec>=p->cd->disc_toc[i].dwStartSector && sec<p->cd->disc_toc[i+1].dwStartSector ) { |
872a1ef8b43b
cosmetics: Reorder functions to avoid forward declarations.
diego
parents:
31443
diff
changeset
|
198 seeked_track = i; |
872a1ef8b43b
cosmetics: Reorder functions to avoid forward declarations.
diego
parents:
31443
diff
changeset
|
199 seek_to_track = sec == p->cd->disc_toc[i].dwStartSector; |
872a1ef8b43b
cosmetics: Reorder functions to avoid forward declarations.
diego
parents:
31443
diff
changeset
|
200 } |
872a1ef8b43b
cosmetics: Reorder functions to avoid forward declarations.
diego
parents:
31443
diff
changeset
|
201 } |
872a1ef8b43b
cosmetics: Reorder functions to avoid forward declarations.
diego
parents:
31443
diff
changeset
|
202 //printf("current: %d, seeked: %d\n", current_track, seeked_track); |
872a1ef8b43b
cosmetics: Reorder functions to avoid forward declarations.
diego
parents:
31443
diff
changeset
|
203 if (current_track != seeked_track && !seek_to_track) { |
872a1ef8b43b
cosmetics: Reorder functions to avoid forward declarations.
diego
parents:
31443
diff
changeset
|
204 //printf("Track %d, sector=%d\n", seeked_track, sec); |
872a1ef8b43b
cosmetics: Reorder functions to avoid forward declarations.
diego
parents:
31443
diff
changeset
|
205 cd_track = cd_info_get_track(p->cd_info, seeked_track+1); |
872a1ef8b43b
cosmetics: Reorder functions to avoid forward declarations.
diego
parents:
31443
diff
changeset
|
206 if( cd_track!=NULL ) { |
872a1ef8b43b
cosmetics: Reorder functions to avoid forward declarations.
diego
parents:
31443
diff
changeset
|
207 mp_msg(MSGT_SEEK, MSGL_INFO, "\n%s\n", cd_track->name); |
872a1ef8b43b
cosmetics: Reorder functions to avoid forward declarations.
diego
parents:
31443
diff
changeset
|
208 mp_msg(MSGT_IDENTIFY, MSGL_INFO, "ID_CDDA_TRACK=%d\n", cd_track->track_nb); |
872a1ef8b43b
cosmetics: Reorder functions to avoid forward declarations.
diego
parents:
31443
diff
changeset
|
209 } |
872a1ef8b43b
cosmetics: Reorder functions to avoid forward declarations.
diego
parents:
31443
diff
changeset
|
210 |
872a1ef8b43b
cosmetics: Reorder functions to avoid forward declarations.
diego
parents:
31443
diff
changeset
|
211 } |
872a1ef8b43b
cosmetics: Reorder functions to avoid forward declarations.
diego
parents:
31443
diff
changeset
|
212 #if 0 |
872a1ef8b43b
cosmetics: Reorder functions to avoid forward declarations.
diego
parents:
31443
diff
changeset
|
213 if(sec < p->start_sector) |
872a1ef8b43b
cosmetics: Reorder functions to avoid forward declarations.
diego
parents:
31443
diff
changeset
|
214 sec = p->start_sector; |
872a1ef8b43b
cosmetics: Reorder functions to avoid forward declarations.
diego
parents:
31443
diff
changeset
|
215 else if(sec > p->end_sector) |
872a1ef8b43b
cosmetics: Reorder functions to avoid forward declarations.
diego
parents:
31443
diff
changeset
|
216 sec = p->end_sector; |
872a1ef8b43b
cosmetics: Reorder functions to avoid forward declarations.
diego
parents:
31443
diff
changeset
|
217 #endif |
872a1ef8b43b
cosmetics: Reorder functions to avoid forward declarations.
diego
parents:
31443
diff
changeset
|
218 |
872a1ef8b43b
cosmetics: Reorder functions to avoid forward declarations.
diego
parents:
31443
diff
changeset
|
219 p->sector = sec; |
872a1ef8b43b
cosmetics: Reorder functions to avoid forward declarations.
diego
parents:
31443
diff
changeset
|
220 // s->pos = sec*CD_FRAMESIZE_RAW; |
872a1ef8b43b
cosmetics: Reorder functions to avoid forward declarations.
diego
parents:
31443
diff
changeset
|
221 |
872a1ef8b43b
cosmetics: Reorder functions to avoid forward declarations.
diego
parents:
31443
diff
changeset
|
222 //printf("seek: %d, sec: %d\n", (int)s->pos, sec); |
872a1ef8b43b
cosmetics: Reorder functions to avoid forward declarations.
diego
parents:
31443
diff
changeset
|
223 paranoia_seek(p->cdp,sec,SEEK_SET); |
872a1ef8b43b
cosmetics: Reorder functions to avoid forward declarations.
diego
parents:
31443
diff
changeset
|
224 return 1; |
872a1ef8b43b
cosmetics: Reorder functions to avoid forward declarations.
diego
parents:
31443
diff
changeset
|
225 } |
872a1ef8b43b
cosmetics: Reorder functions to avoid forward declarations.
diego
parents:
31443
diff
changeset
|
226 |
872a1ef8b43b
cosmetics: Reorder functions to avoid forward declarations.
diego
parents:
31443
diff
changeset
|
227 static void close_cdda(stream_t* s) { |
872a1ef8b43b
cosmetics: Reorder functions to avoid forward declarations.
diego
parents:
31443
diff
changeset
|
228 cdda_priv* p = (cdda_priv*)s->priv; |
872a1ef8b43b
cosmetics: Reorder functions to avoid forward declarations.
diego
parents:
31443
diff
changeset
|
229 paranoia_free(p->cdp); |
872a1ef8b43b
cosmetics: Reorder functions to avoid forward declarations.
diego
parents:
31443
diff
changeset
|
230 cdda_close(p->cd); |
872a1ef8b43b
cosmetics: Reorder functions to avoid forward declarations.
diego
parents:
31443
diff
changeset
|
231 cd_info_free(p->cd_info); |
872a1ef8b43b
cosmetics: Reorder functions to avoid forward declarations.
diego
parents:
31443
diff
changeset
|
232 free(p); |
872a1ef8b43b
cosmetics: Reorder functions to avoid forward declarations.
diego
parents:
31443
diff
changeset
|
233 } |
9801 | 234 |
25410 | 235 static int get_track_by_sector(cdda_priv *p, unsigned int sector) { |
236 int i; | |
237 for (i = p->cd->tracks; i >= 0 ; --i) | |
238 if (p->cd->disc_toc[i].dwStartSector <= sector) | |
239 break; | |
240 return i; | |
241 } | |
242 | |
243 static int control(stream_t *stream, int cmd, void *arg) { | |
244 cdda_priv* p = stream->priv; | |
245 switch(cmd) { | |
34386
206264c532f5
Add new stream control command STREAM_CTRL_GET_NUM_TITLES.
ib
parents:
34384
diff
changeset
|
246 case STREAM_CTRL_GET_NUM_TITLES: |
206264c532f5
Add new stream control command STREAM_CTRL_GET_NUM_TITLES.
ib
parents:
34384
diff
changeset
|
247 { |
206264c532f5
Add new stream control command STREAM_CTRL_GET_NUM_TITLES.
ib
parents:
34384
diff
changeset
|
248 *(unsigned int *)arg = p->cd->tracks; |
206264c532f5
Add new stream control command STREAM_CTRL_GET_NUM_TITLES.
ib
parents:
34384
diff
changeset
|
249 return STREAM_OK; |
206264c532f5
Add new stream control command STREAM_CTRL_GET_NUM_TITLES.
ib
parents:
34384
diff
changeset
|
250 } |
25410 | 251 case STREAM_CTRL_GET_NUM_CHAPTERS: |
252 { | |
253 int start_track = get_track_by_sector(p, p->start_sector); | |
254 int end_track = get_track_by_sector(p, p->end_sector); | |
34407
614c99d4cbbf
Add checks for errors in stream_cdda's get_track_by_sector().
ib
parents:
34386
diff
changeset
|
255 if (start_track == -1 || end_track == -1) return STREAM_ERROR; |
25410 | 256 *(unsigned int *)arg = end_track + 1 - start_track; |
257 return STREAM_OK; | |
258 } | |
259 case STREAM_CTRL_SEEK_TO_CHAPTER: | |
260 { | |
261 int r; | |
262 unsigned int track = *(unsigned int *)arg; | |
263 int start_track = get_track_by_sector(p, p->start_sector); | |
34372
622b7e95695a
Fail if trying to seek beyond the last chapter, not just if it is beyond the end of the disc.
reimar
parents:
34371
diff
changeset
|
264 int end_track = get_track_by_sector(p, p->end_sector); |
25410 | 265 int seek_sector; |
34407
614c99d4cbbf
Add checks for errors in stream_cdda's get_track_by_sector().
ib
parents:
34386
diff
changeset
|
266 if (start_track == -1 || end_track == -1) return STREAM_ERROR; |
25410 | 267 track += start_track; |
34372
622b7e95695a
Fail if trying to seek beyond the last chapter, not just if it is beyond the end of the disc.
reimar
parents:
34371
diff
changeset
|
268 if (track > end_track) { |
34374
09f2662d11cb
cdda: set position to an actual EOF position when we set EOF.
reimar
parents:
34372
diff
changeset
|
269 seek(stream, (p->end_sector + 1) * CD_FRAMESIZE_RAW); |
34489
bdc9f135ac26
Fix seeking beyond EOF in stream_cdda to work with cache.
reimar
parents:
34407
diff
changeset
|
270 // seeking beyond EOF should not be an error, |
bdc9f135ac26
Fix seeking beyond EOF in stream_cdda to work with cache.
reimar
parents:
34407
diff
changeset
|
271 // the cache cannot handle changing stream pos and |
bdc9f135ac26
Fix seeking beyond EOF in stream_cdda to work with cache.
reimar
parents:
34407
diff
changeset
|
272 // returning error. |
bdc9f135ac26
Fix seeking beyond EOF in stream_cdda to work with cache.
reimar
parents:
34407
diff
changeset
|
273 return STREAM_OK; |
25410 | 274 } |
275 seek_sector = track <= 0 ? p->start_sector | |
276 : p->cd->disc_toc[track].dwStartSector; | |
277 r = seek(stream, seek_sector * CD_FRAMESIZE_RAW); | |
278 if (r) | |
279 return STREAM_OK; | |
280 break; | |
281 } | |
282 case STREAM_CTRL_GET_CURRENT_CHAPTER: | |
283 { | |
284 int start_track = get_track_by_sector(p, p->start_sector); | |
285 int cur_track = get_track_by_sector(p, p->sector); | |
34407
614c99d4cbbf
Add checks for errors in stream_cdda's get_track_by_sector().
ib
parents:
34386
diff
changeset
|
286 if (start_track == -1 || cur_track == -1) return STREAM_ERROR; |
25410 | 287 *(unsigned int *)arg = cur_track - start_track; |
288 return STREAM_OK; | |
289 } | |
290 } | |
291 return STREAM_UNSUPPORTED; | |
292 } | |
293 | |
9801 | 294 static int open_cdda(stream_t *st,int m, void* opts, int* file_format) { |
295 struct cdda_params* p = (struct cdda_params*)opts; | |
296 int mode = p->paranoia_mode; | |
297 int offset = p->toc_offset; | |
27391
1d2faa1020fb
Rename a bunch of miscellaneous preprocessor directives.
diego
parents:
25691
diff
changeset
|
298 #ifndef CONFIG_LIBCDIO |
6384
f0b933918a22
Support for playing audio cds using cdparanoia. Include a raw audio
albeu
parents:
diff
changeset
|
299 cdrom_drive* cdd = NULL; |
16935
60bd6aeed405
make it optionally possible to compile MPlayer with libcdio instead of libcdparanoia
faust3
parents:
16926
diff
changeset
|
300 #else |
60bd6aeed405
make it optionally possible to compile MPlayer with libcdio instead of libcdparanoia
faust3
parents:
16926
diff
changeset
|
301 cdrom_drive_t* cdd = NULL; |
60bd6aeed405
make it optionally possible to compile MPlayer with libcdio instead of libcdparanoia
faust3
parents:
16926
diff
changeset
|
302 #endif |
6384
f0b933918a22
Support for playing audio cds using cdparanoia. Include a raw audio
albeu
parents:
diff
changeset
|
303 cdda_priv* priv; |
9801 | 304 cd_info_t *cd_info,*cddb_info = NULL; |
6696 | 305 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
|
306 int last_track; |
6696 | 307 int i; |
9801 | 308 char *xmcd_file = NULL; |
6384
f0b933918a22
Support for playing audio cds using cdparanoia. Include a raw audio
albeu
parents:
diff
changeset
|
309 |
9801 | 310 if(m != STREAM_READ) { |
311 m_struct_free(&stream_opts,opts); | |
24257 | 312 return STREAM_UNSUPPORTED; |
9801 | 313 } |
6384
f0b933918a22
Support for playing audio cds using cdparanoia. Include a raw audio
albeu
parents:
diff
changeset
|
314 |
10591 | 315 if(!p->device) { |
316 if (cdrom_device) | |
317 p->device = strdup(cdrom_device); | |
318 else | |
319 p->device = strdup(DEFAULT_CDROM_DEVICE); | |
320 } | |
321 | |
27391
1d2faa1020fb
Rename a bunch of miscellaneous preprocessor directives.
diego
parents:
25691
diff
changeset
|
322 #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
|
323 // 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
|
324 // 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
|
325 if(cdd_identify(p->device) >= 0 && strncmp(st->url,"cddb",4) == 0) { |
9801 | 326 i = cddb_resolve(p->device, &xmcd_file); |
327 if(i == 0) { | |
328 cddb_info = cddb_parse_xmcd(xmcd_file); | |
329 free(xmcd_file); | |
6384
f0b933918a22
Support for playing audio cds using cdparanoia. Include a raw audio
albeu
parents:
diff
changeset
|
330 } |
f0b933918a22
Support for playing audio cds using cdparanoia. Include a raw audio
albeu
parents:
diff
changeset
|
331 } |
9801 | 332 #endif |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
28051
diff
changeset
|
333 |
27391
1d2faa1020fb
Rename a bunch of miscellaneous preprocessor directives.
diego
parents:
25691
diff
changeset
|
334 #ifndef CONFIG_LIBCDIO |
9801 | 335 if(p->generic_dev) |
336 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
|
337 else |
16935
60bd6aeed405
make it optionally possible to compile MPlayer with libcdio instead of libcdparanoia
faust3
parents:
16926
diff
changeset
|
338 #endif |
8958
56bf90cefb10
Removed the hardcoded /dev/cdrom for NetBSD and added an work around
bertrand
parents:
8609
diff
changeset
|
339 #if defined(__NetBSD__) |
9801 | 340 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
|
341 #else |
9801 | 342 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
|
343 #endif |
6384
f0b933918a22
Support for playing audio cds using cdparanoia. Include a raw audio
albeu
parents:
diff
changeset
|
344 |
f0b933918a22
Support for playing audio cds using cdparanoia. Include a raw audio
albeu
parents:
diff
changeset
|
345 if(!cdd) { |
16967
32e2c59c8e86
[TRIVIAL] More translatables to help_mp and printfs to mp_msg on libmpdemux
reynaldo
parents:
16940
diff
changeset
|
346 mp_msg(MSGT_OPEN,MSGL_ERR,MSGTR_MPDEMUX_CDDA_CantOpenCDDADevice); |
9801 | 347 m_struct_free(&stream_opts,opts); |
18225 | 348 free(cddb_info); |
9801 | 349 return STREAM_ERROR; |
6384
f0b933918a22
Support for playing audio cds using cdparanoia. Include a raw audio
albeu
parents:
diff
changeset
|
350 } |
f0b933918a22
Support for playing audio cds using cdparanoia. Include a raw audio
albeu
parents:
diff
changeset
|
351 |
f0b933918a22
Support for playing audio cds using cdparanoia. Include a raw audio
albeu
parents:
diff
changeset
|
352 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
|
353 |
9801 | 354 if(p->sector_size) { |
355 cdd->nsectors = p->sector_size; | |
27391
1d2faa1020fb
Rename a bunch of miscellaneous preprocessor directives.
diego
parents:
25691
diff
changeset
|
356 #ifndef CONFIG_LIBCDIO |
9801 | 357 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
|
358 #endif |
6384
f0b933918a22
Support for playing audio cds using cdparanoia. Include a raw audio
albeu
parents:
diff
changeset
|
359 } |
f0b933918a22
Support for playing audio cds using cdparanoia. Include a raw audio
albeu
parents:
diff
changeset
|
360 |
f0b933918a22
Support for playing audio cds using cdparanoia. Include a raw audio
albeu
parents:
diff
changeset
|
361 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
|
362 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
|
363 cdda_close(cdd); |
9801 | 364 m_struct_free(&stream_opts,opts); |
18225 | 365 free(cddb_info); |
9801 | 366 return STREAM_ERROR; |
6384
f0b933918a22
Support for playing audio cds using cdparanoia. Include a raw audio
albeu
parents:
diff
changeset
|
367 } |
f0b933918a22
Support for playing audio cds using cdparanoia. Include a raw audio
albeu
parents:
diff
changeset
|
368 |
6696 | 369 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
|
370 mp_msg(MSGT_OPEN,MSGL_INFO,MSGTR_MPDEMUX_CDDA_AudioCDFoundWithNTracks,cdda_tracks(cdd)); |
6696 | 371 for(i=0;i<cdd->tracks;i++) { |
372 char track_name[80]; | |
373 long sec=cdda_track_firstsector(cdd,i+1); | |
374 long off=cdda_track_lastsector(cdd,i+1)-sec+1; | |
375 | |
376 sprintf(track_name, "Track %d", i+1); | |
377 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 ); | |
378 audiolen += off; | |
379 } | |
380 cd_info->min = (unsigned int)(audiolen/(60*75)); | |
381 cd_info->sec = (unsigned int)((audiolen/75)%60); | |
382 cd_info->msec = (unsigned int)(audiolen%75); | |
383 | |
19062
83c3afeab35d
drops casts from void * on malloc/calloc from libmpdemux code
reynaldo
parents:
18922
diff
changeset
|
384 priv = malloc(sizeof(cdda_priv)); |
6696 | 385 memset(priv, 0, sizeof(cdda_priv)); |
6384
f0b933918a22
Support for playing audio cds using cdparanoia. Include a raw audio
albeu
parents:
diff
changeset
|
386 priv->cd = cdd; |
6696 | 387 priv->cd_info = cd_info; |
6384
f0b933918a22
Support for playing audio cds using cdparanoia. Include a raw audio
albeu
parents:
diff
changeset
|
388 |
9801 | 389 if(p->toc_bias) |
6384
f0b933918a22
Support for playing audio cds using cdparanoia. Include a raw audio
albeu
parents:
diff
changeset
|
390 offset -= cdda_track_firstsector(cdd,1); |
f0b933918a22
Support for playing audio cds using cdparanoia. Include a raw audio
albeu
parents:
diff
changeset
|
391 |
f0b933918a22
Support for playing audio cds using cdparanoia. Include a raw audio
albeu
parents:
diff
changeset
|
392 if(offset) { |
f0b933918a22
Support for playing audio cds using cdparanoia. Include a raw audio
albeu
parents:
diff
changeset
|
393 int i; |
f0b933918a22
Support for playing audio cds using cdparanoia. Include a raw audio
albeu
parents:
diff
changeset
|
394 for(i = 0 ; i < cdd->tracks + 1 ; i++) |
f0b933918a22
Support for playing audio cds using cdparanoia. Include a raw audio
albeu
parents:
diff
changeset
|
395 cdd->disc_toc[i].dwStartSector += offset; |
f0b933918a22
Support for playing audio cds using cdparanoia. Include a raw audio
albeu
parents:
diff
changeset
|
396 } |
f0b933918a22
Support for playing audio cds using cdparanoia. Include a raw audio
albeu
parents:
diff
changeset
|
397 |
34370
a958ea863ee1
Fix cdda speed default value, range and use more robust condition.
reimar
parents:
33469
diff
changeset
|
398 if(p->speed > 0) |
9801 | 399 cdda_speed_set(cdd,p->speed); |
6384
f0b933918a22
Support for playing audio cds using cdparanoia. Include a raw audio
albeu
parents:
diff
changeset
|
400 |
16926
24c52f2c3aa9
fix cdda://n syntax: do not hang when n > nr_tracks and play only track n,
reimar
parents:
16914
diff
changeset
|
401 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
|
402 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
|
403 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
|
404 if (p->span.end > last_track) p->span.end = last_track; |
9801 | 405 if(p->span.start) |
406 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
|
407 else |
f0b933918a22
Support for playing audio cds using cdparanoia. Include a raw audio
albeu
parents:
diff
changeset
|
408 priv->start_sector = cdda_disc_firstsector(cdd); |
f0b933918a22
Support for playing audio cds using cdparanoia. Include a raw audio
albeu
parents:
diff
changeset
|
409 |
9801 | 410 if(p->span.end) { |
411 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
|
412 } else |
f0b933918a22
Support for playing audio cds using cdparanoia. Include a raw audio
albeu
parents:
diff
changeset
|
413 priv->end_sector = cdda_disc_lastsector(cdd); |
f0b933918a22
Support for playing audio cds using cdparanoia. Include a raw audio
albeu
parents:
diff
changeset
|
414 |
f0b933918a22
Support for playing audio cds using cdparanoia. Include a raw audio
albeu
parents:
diff
changeset
|
415 priv->cdp = paranoia_init(cdd); |
f0b933918a22
Support for playing audio cds using cdparanoia. Include a raw audio
albeu
parents:
diff
changeset
|
416 if(priv->cdp == NULL) { |
f0b933918a22
Support for playing audio cds using cdparanoia. Include a raw audio
albeu
parents:
diff
changeset
|
417 cdda_close(cdd); |
f0b933918a22
Support for playing audio cds using cdparanoia. Include a raw audio
albeu
parents:
diff
changeset
|
418 free(priv); |
9801 | 419 cd_info_free(cd_info); |
420 m_struct_free(&stream_opts,opts); | |
18225 | 421 free(cddb_info); |
9801 | 422 return STREAM_ERROR; |
6384
f0b933918a22
Support for playing audio cds using cdparanoia. Include a raw audio
albeu
parents:
diff
changeset
|
423 } |
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 if(mode == 0) |
f0b933918a22
Support for playing audio cds using cdparanoia. Include a raw audio
albeu
parents:
diff
changeset
|
426 mode = PARANOIA_MODE_DISABLE; |
f0b933918a22
Support for playing audio cds using cdparanoia. Include a raw audio
albeu
parents:
diff
changeset
|
427 else if(mode == 1) |
f0b933918a22
Support for playing audio cds using cdparanoia. Include a raw audio
albeu
parents:
diff
changeset
|
428 mode = PARANOIA_MODE_OVERLAP; |
f0b933918a22
Support for playing audio cds using cdparanoia. Include a raw audio
albeu
parents:
diff
changeset
|
429 else |
f0b933918a22
Support for playing audio cds using cdparanoia. Include a raw audio
albeu
parents:
diff
changeset
|
430 mode = PARANOIA_MODE_FULL; |
29263
0f1b5b68af32
whitespace cosmetics: Remove all trailing whitespace.
diego
parents:
28051
diff
changeset
|
431 |
9801 | 432 if(p->no_skip) |
6384
f0b933918a22
Support for playing audio cds using cdparanoia. Include a raw audio
albeu
parents:
diff
changeset
|
433 mode |= PARANOIA_MODE_NEVERSKIP; |
34379 | 434 else |
435 mode &= ~PARANOIA_MODE_NEVERSKIP; | |
436 | |
34371
a4dd7151526b
Do not call paranoia_overlapset with 0, it actually causes cdparanoia to just hang.
reimar
parents:
34370
diff
changeset
|
437 if(p->search_overlap > 0) |
a4dd7151526b
Do not call paranoia_overlapset with 0, it actually causes cdparanoia to just hang.
reimar
parents:
34370
diff
changeset
|
438 mode |= PARANOIA_MODE_OVERLAP; |
a4dd7151526b
Do not call paranoia_overlapset with 0, it actually causes cdparanoia to just hang.
reimar
parents:
34370
diff
changeset
|
439 else if(p->search_overlap == 0) |
a4dd7151526b
Do not call paranoia_overlapset with 0, it actually causes cdparanoia to just hang.
reimar
parents:
34370
diff
changeset
|
440 mode &= ~PARANOIA_MODE_OVERLAP; |
27391
1d2faa1020fb
Rename a bunch of miscellaneous preprocessor directives.
diego
parents:
25691
diff
changeset
|
441 #ifndef CONFIG_LIBCDIO |
33469
17519ae1f249
Constrain libcdparanoia's caching which badly breaks playback with -nocache.
reimar
parents:
31445
diff
changeset
|
442 // HACK against libcdparanoia's stupid caching model that |
17519ae1f249
Constrain libcdparanoia's caching which badly breaks playback with -nocache.
reimar
parents:
31445
diff
changeset
|
443 // queues up a huge number of requests leading to stuttering |
17519ae1f249
Constrain libcdparanoia's caching which badly breaks playback with -nocache.
reimar
parents:
31445
diff
changeset
|
444 paranoia_cachemodel_size(priv->cdp, 24); |
34384
475b95b38f59
Add comment to a condition that is just a hack around a cdparanoia bug.
reimar
parents:
34380
diff
changeset
|
445 // For some incomprehensible reason cdparanoia breaks the |
475b95b38f59
Add comment to a condition that is just a hack around a cdparanoia bug.
reimar
parents:
34380
diff
changeset
|
446 // track->sector lookup of calling paranoia_modeset with |
475b95b38f59
Add comment to a condition that is just a hack around a cdparanoia bug.
reimar
parents:
34380
diff
changeset
|
447 // PARANOIA_MODE_DISABLE |
34380
9b11eb048fca
Don't call paranoia_modeset() for PARANOIA_MODE_DISABLE.
ib
parents:
34379
diff
changeset
|
448 if (mode != PARANOIA_MODE_DISABLE) paranoia_modeset(cdd, mode); |
6384
f0b933918a22
Support for playing audio cds using cdparanoia. Include a raw audio
albeu
parents:
diff
changeset
|
449 |
34371
a4dd7151526b
Do not call paranoia_overlapset with 0, it actually causes cdparanoia to just hang.
reimar
parents:
34370
diff
changeset
|
450 if(p->search_overlap > 0) |
9801 | 451 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
|
452 #else |
60bd6aeed405
make it optionally possible to compile MPlayer with libcdio instead of libcdparanoia
faust3
parents:
16926
diff
changeset
|
453 paranoia_modeset(priv->cdp, mode); |
60bd6aeed405
make it optionally possible to compile MPlayer with libcdio instead of libcdparanoia
faust3
parents:
16926
diff
changeset
|
454 |
34371
a4dd7151526b
Do not call paranoia_overlapset with 0, it actually causes cdparanoia to just hang.
reimar
parents:
34370
diff
changeset
|
455 if(p->search_overlap > 0) |
16935
60bd6aeed405
make it optionally possible to compile MPlayer with libcdio instead of libcdparanoia
faust3
parents:
16926
diff
changeset
|
456 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
|
457 #endif |
6384
f0b933918a22
Support for playing audio cds using cdparanoia. Include a raw audio
albeu
parents:
diff
changeset
|
458 |
f0b933918a22
Support for playing audio cds using cdparanoia. Include a raw audio
albeu
parents:
diff
changeset
|
459 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
|
460 priv->sector = priv->start_sector; |
f0b933918a22
Support for playing audio cds using cdparanoia. Include a raw audio
albeu
parents:
diff
changeset
|
461 |
27391
1d2faa1020fb
Rename a bunch of miscellaneous preprocessor directives.
diego
parents:
25691
diff
changeset
|
462 #ifdef CONFIG_CDDB |
9801 | 463 if(cddb_info) { |
464 cd_info_free(cd_info); | |
465 priv->cd_info = cddb_info; | |
466 cd_info_debug( cddb_info ); | |
467 } | |
468 #endif | |
469 | |
6384
f0b933918a22
Support for playing audio cds using cdparanoia. Include a raw audio
albeu
parents:
diff
changeset
|
470 st->priv = priv; |
f0b933918a22
Support for playing audio cds using cdparanoia. Include a raw audio
albeu
parents:
diff
changeset
|
471 st->start_pos = priv->start_sector*CD_FRAMESIZE_RAW; |
25382 | 472 st->end_pos = (priv->end_sector + 1) * CD_FRAMESIZE_RAW; |
9801 | 473 st->type = STREAMTYPE_CDDA; |
474 st->sector_size = CD_FRAMESIZE_RAW; | |
6384
f0b933918a22
Support for playing audio cds using cdparanoia. Include a raw audio
albeu
parents:
diff
changeset
|
475 |
9801 | 476 st->fill_buffer = fill_buffer; |
477 st->seek = seek; | |
25410 | 478 st->control = control; |
16935
60bd6aeed405
make it optionally possible to compile MPlayer with libcdio instead of libcdparanoia
faust3
parents:
16926
diff
changeset
|
479 st->close = close_cdda; |
9801 | 480 |
481 *file_format = DEMUXER_TYPE_RAWAUDIO; | |
482 | |
483 m_struct_free(&stream_opts,opts); | |
484 | |
485 return STREAM_OK; | |
6384
f0b933918a22
Support for playing audio cds using cdparanoia. Include a raw audio
albeu
parents:
diff
changeset
|
486 } |
f0b933918a22
Support for playing audio cds using cdparanoia. Include a raw audio
albeu
parents:
diff
changeset
|
487 |
25211 | 488 const stream_info_t stream_info_cdda = { |
9801 | 489 "CDDA", |
490 "cdda", | |
491 "Albeu", | |
492 "", | |
493 open_cdda, | |
21479 | 494 { "cdda", |
27391
1d2faa1020fb
Rename a bunch of miscellaneous preprocessor directives.
diego
parents:
25691
diff
changeset
|
495 #ifdef CONFIG_CDDB |
21479 | 496 "cddb", |
497 #endif | |
498 NULL }, | |
9801 | 499 &stream_opts, |
500 1 // Urls are an option string | |
501 }; |