annotate stream/stream_cdda.c @ 30811:50e0f6942e43

Implement Win32 mutexes. Implement Win32 mutexes; they used to just be mapped on top of events, which is not the same thing at all. The implementation is pretty much the obvious one, similar to the current critical section implementation and the semaphore implementation; a single lock count protected by a pthread mutex, and an event lockers can sleep on to know when the mutex is available. Also make CreateMutexA and ReleaseMutex available even if QuickTime codecs support is not configured.
author sesse
date Sat, 06 Mar 2010 10:13:37 +0000
parents ce0122361a39
children 045110c125c6
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
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"
f0b933918a22 Support for playing audio cds using cdparanoia. Include a raw audio
albeu
parents:
diff changeset
20
21418
cc5b0c53b263 Move system headers before libavutil headers to work around build issues on
diego
parents: 21372
diff changeset
21 #include <stdio.h>
cc5b0c53b263 Move system headers before libavutil headers to work around build issues on
diego
parents: 21372
diff changeset
22 #include <stdlib.h>
cc5b0c53b263 Move system headers before libavutil headers to work around build issues on
diego
parents: 21372
diff changeset
23
6384
f0b933918a22 Support for playing audio cds using cdparanoia. Include a raw audio
albeu
parents:
diff changeset
24 #include "stream.h"
17012
6ff3379a0862 Unify include path handling, -I.. is in CFLAGS.
diego
parents: 16967
diff changeset
25 #include "m_option.h"
6ff3379a0862 Unify include path handling, -I.. is in CFLAGS.
diego
parents: 16967
diff changeset
26 #include "m_struct.h"
21372
1767c271d710 Remove bswap.h, use libavutil/bswap.h instead.
diego
parents: 20195
diff changeset
27 #include "libavutil/common.h"
21507
fa99b3d31d13 Hack around libavutil/bswap.h compilation problems due to always_inline undefined.
reimar
parents: 21479
diff changeset
28 #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
29 #include "libmpdemux/demuxer.h"
6384
f0b933918a22 Support for playing audio cds using cdparanoia. Include a raw audio
albeu
parents:
diff changeset
30
6696
030e3fa9cf4a Build a fake list of track name.
bertrand
parents: 6384
diff changeset
31 #include "cdd.h"
6384
f0b933918a22 Support for playing audio cds using cdparanoia. Include a raw audio
albeu
parents:
diff changeset
32
16967
32e2c59c8e86 [TRIVIAL] More translatables to help_mp and printfs to mp_msg on libmpdemux
reynaldo
parents: 16940
diff changeset
33 #include "mp_msg.h"
32e2c59c8e86 [TRIVIAL] More translatables to help_mp and printfs to mp_msg on libmpdemux
reynaldo
parents: 16940
diff changeset
34 #include "help_mp.h"
32e2c59c8e86 [TRIVIAL] More translatables to help_mp and printfs to mp_msg on libmpdemux
reynaldo
parents: 16940
diff changeset
35
16940
7eb9b500dd7f save us from #ifndef hell
faust3
parents: 16935
diff changeset
36 #ifndef CD_FRAMESIZE_RAW
7eb9b500dd7f save us from #ifndef hell
faust3
parents: 16935
diff changeset
37 #define CD_FRAMESIZE_RAW CDIO_CD_FRAMESIZE_RAW
7eb9b500dd7f save us from #ifndef hell
faust3
parents: 16935
diff changeset
38 #endif
7eb9b500dd7f save us from #ifndef hell
faust3
parents: 16935
diff changeset
39
7eb9b500dd7f save us from #ifndef hell
faust3
parents: 16935
diff changeset
40
10591
0d381b648b51 Fix -cdrom-device to work again with cdda and vcd.
albeu
parents: 10121
diff changeset
41 extern char *cdrom_device;
0d381b648b51 Fix -cdrom-device to work again with cdda and vcd.
albeu
parents: 10121
diff changeset
42
9801
2f02809d32a8 URL is cdda://tracks[:speed][/device]
albeu
parents: 9656
diff changeset
43 static struct cdda_params {
2f02809d32a8 URL is cdda://tracks[:speed][/device]
albeu
parents: 9656
diff changeset
44 int speed;
2f02809d32a8 URL is cdda://tracks[:speed][/device]
albeu
parents: 9656
diff changeset
45 int paranoia_mode;
2f02809d32a8 URL is cdda://tracks[:speed][/device]
albeu
parents: 9656
diff changeset
46 char* generic_dev;
2f02809d32a8 URL is cdda://tracks[:speed][/device]
albeu
parents: 9656
diff changeset
47 int sector_size;
2f02809d32a8 URL is cdda://tracks[:speed][/device]
albeu
parents: 9656
diff changeset
48 int search_overlap;
2f02809d32a8 URL is cdda://tracks[:speed][/device]
albeu
parents: 9656
diff changeset
49 int toc_bias;
2f02809d32a8 URL is cdda://tracks[:speed][/device]
albeu
parents: 9656
diff changeset
50 int toc_offset;
2f02809d32a8 URL is cdda://tracks[:speed][/device]
albeu
parents: 9656
diff changeset
51 int no_skip;
2f02809d32a8 URL is cdda://tracks[:speed][/device]
albeu
parents: 9656
diff changeset
52 char* device;
2f02809d32a8 URL is cdda://tracks[:speed][/device]
albeu
parents: 9656
diff changeset
53 m_span_t span;
2f02809d32a8 URL is cdda://tracks[:speed][/device]
albeu
parents: 9656
diff changeset
54 } cdda_dflts = {
2f02809d32a8 URL is cdda://tracks[:speed][/device]
albeu
parents: 9656
diff changeset
55 -1,
16914
701af802aee7 set cdda paranoia default to 0 since e.g. cdda://2 breaks otherwise.
reimar
parents: 16635
diff changeset
56 0,
9801
2f02809d32a8 URL is cdda://tracks[:speed][/device]
albeu
parents: 9656
diff changeset
57 NULL,
2f02809d32a8 URL is cdda://tracks[:speed][/device]
albeu
parents: 9656
diff changeset
58 0,
2f02809d32a8 URL is cdda://tracks[:speed][/device]
albeu
parents: 9656
diff changeset
59 -1,
2f02809d32a8 URL is cdda://tracks[:speed][/device]
albeu
parents: 9656
diff changeset
60 0,
2f02809d32a8 URL is cdda://tracks[:speed][/device]
albeu
parents: 9656
diff changeset
61 0,
2f02809d32a8 URL is cdda://tracks[:speed][/device]
albeu
parents: 9656
diff changeset
62 0,
10591
0d381b648b51 Fix -cdrom-device to work again with cdda and vcd.
albeu
parents: 10121
diff changeset
63 NULL,
9801
2f02809d32a8 URL is cdda://tracks[:speed][/device]
albeu
parents: 9656
diff changeset
64 { 0, 0 }
2f02809d32a8 URL is cdda://tracks[:speed][/device]
albeu
parents: 9656
diff changeset
65 };
6384
f0b933918a22 Support for playing audio cds using cdparanoia. Include a raw audio
albeu
parents:
diff changeset
66
9801
2f02809d32a8 URL is cdda://tracks[:speed][/device]
albeu
parents: 9656
diff changeset
67 #define ST_OFF(f) M_ST_OFF(struct cdda_params,f)
25242
371a40dcc1cc stream_opts arrays should be const
reimar
parents: 25241
diff changeset
68 static const m_option_t cdda_params_fields[] = {
9801
2f02809d32a8 URL is cdda://tracks[:speed][/device]
albeu
parents: 9656
diff changeset
69 { "speed", ST_OFF(speed), CONF_TYPE_INT, M_OPT_RANGE,1,100, NULL },
2f02809d32a8 URL is cdda://tracks[:speed][/device]
albeu
parents: 9656
diff changeset
70 { "paranoia", ST_OFF(paranoia_mode), CONF_TYPE_INT,M_OPT_RANGE, 0, 2, NULL },
2f02809d32a8 URL is cdda://tracks[:speed][/device]
albeu
parents: 9656
diff changeset
71 { "generic-dev", ST_OFF(generic_dev), CONF_TYPE_STRING, 0, 0, 0, NULL },
2f02809d32a8 URL is cdda://tracks[:speed][/device]
albeu
parents: 9656
diff changeset
72 { "sector-size", ST_OFF(sector_size), CONF_TYPE_INT, M_OPT_RANGE,1,100, NULL },
2f02809d32a8 URL is cdda://tracks[:speed][/device]
albeu
parents: 9656
diff changeset
73 { "overlap", ST_OFF(search_overlap), CONF_TYPE_INT, M_OPT_RANGE,0,75, NULL },
2f02809d32a8 URL is cdda://tracks[:speed][/device]
albeu
parents: 9656
diff changeset
74 { "toc-bias", ST_OFF(toc_bias), CONF_TYPE_INT, 0, 0, 0, NULL },
2f02809d32a8 URL is cdda://tracks[:speed][/device]
albeu
parents: 9656
diff changeset
75 { "toc-offset", ST_OFF(toc_offset), CONF_TYPE_INT, 0, 0, 0, NULL },
2f02809d32a8 URL is cdda://tracks[:speed][/device]
albeu
parents: 9656
diff changeset
76 { "noskip", ST_OFF(no_skip), CONF_TYPE_FLAG, 0 , 0, 1, NULL },
2f02809d32a8 URL is cdda://tracks[:speed][/device]
albeu
parents: 9656
diff changeset
77 { "skip", ST_OFF(no_skip), CONF_TYPE_FLAG, 0 , 1, 0, NULL },
2f02809d32a8 URL is cdda://tracks[:speed][/device]
albeu
parents: 9656
diff changeset
78 { "device", ST_OFF(device), CONF_TYPE_STRING, 0, 0, 0, NULL },
2f02809d32a8 URL is cdda://tracks[:speed][/device]
albeu
parents: 9656
diff changeset
79 { "span", ST_OFF(span), CONF_TYPE_OBJ_PARAMS, 0, 0, 0, &m_span_params_def },
2f02809d32a8 URL is cdda://tracks[:speed][/device]
albeu
parents: 9656
diff changeset
80 /// For url parsing
2f02809d32a8 URL is cdda://tracks[:speed][/device]
albeu
parents: 9656
diff changeset
81 { "hostname", ST_OFF(span), CONF_TYPE_OBJ_PARAMS, 0, 0, 0, &m_span_params_def },
2f02809d32a8 URL is cdda://tracks[:speed][/device]
albeu
parents: 9656
diff changeset
82 { "port", ST_OFF(speed), CONF_TYPE_INT, M_OPT_RANGE,1,100, NULL },
2f02809d32a8 URL is cdda://tracks[:speed][/device]
albeu
parents: 9656
diff changeset
83 { "filename", ST_OFF(device), CONF_TYPE_STRING, 0, 0, 0, NULL },
2f02809d32a8 URL is cdda://tracks[:speed][/device]
albeu
parents: 9656
diff changeset
84 {NULL, NULL, 0, 0, 0, 0, NULL}
2f02809d32a8 URL is cdda://tracks[:speed][/device]
albeu
parents: 9656
diff changeset
85 };
25691
68015115f63a stream_opts should be const
reimar
parents: 25410
diff changeset
86 static const struct m_struct_st stream_opts = {
9801
2f02809d32a8 URL is cdda://tracks[:speed][/device]
albeu
parents: 9656
diff changeset
87 "cdda",
2f02809d32a8 URL is cdda://tracks[:speed][/device]
albeu
parents: 9656
diff changeset
88 sizeof(struct cdda_params),
2f02809d32a8 URL is cdda://tracks[:speed][/device]
albeu
parents: 9656
diff changeset
89 &cdda_dflts,
2f02809d32a8 URL is cdda://tracks[:speed][/device]
albeu
parents: 9656
diff changeset
90 cdda_params_fields
2f02809d32a8 URL is cdda://tracks[:speed][/device]
albeu
parents: 9656
diff changeset
91 };
2f02809d32a8 URL is cdda://tracks[:speed][/device]
albeu
parents: 9656
diff changeset
92
2f02809d32a8 URL is cdda://tracks[:speed][/device]
albeu
parents: 9656
diff changeset
93 /// 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
94 const m_option_t cdda_opts[] = {
9801
2f02809d32a8 URL is cdda://tracks[:speed][/device]
albeu
parents: 9656
diff changeset
95 { "speed", &cdda_dflts.speed, CONF_TYPE_INT, M_OPT_RANGE,1,100, NULL },
2f02809d32a8 URL is cdda://tracks[:speed][/device]
albeu
parents: 9656
diff changeset
96 { "paranoia", &cdda_dflts.paranoia_mode, CONF_TYPE_INT,M_OPT_RANGE, 0, 2, NULL },
2f02809d32a8 URL is cdda://tracks[:speed][/device]
albeu
parents: 9656
diff changeset
97 { "generic-dev", &cdda_dflts.generic_dev, CONF_TYPE_STRING, 0, 0, 0, NULL },
2f02809d32a8 URL is cdda://tracks[:speed][/device]
albeu
parents: 9656
diff changeset
98 { "sector-size", &cdda_dflts.sector_size, CONF_TYPE_INT, M_OPT_RANGE,1,100, NULL },
2f02809d32a8 URL is cdda://tracks[:speed][/device]
albeu
parents: 9656
diff changeset
99 { "overlap", &cdda_dflts.search_overlap, CONF_TYPE_INT, M_OPT_RANGE,0,75, NULL },
2f02809d32a8 URL is cdda://tracks[:speed][/device]
albeu
parents: 9656
diff changeset
100 { "toc-bias", &cdda_dflts.toc_bias, CONF_TYPE_INT, 0, 0, 0, NULL },
2f02809d32a8 URL is cdda://tracks[:speed][/device]
albeu
parents: 9656
diff changeset
101 { "toc-offset", &cdda_dflts.toc_offset, CONF_TYPE_INT, 0, 0, 0, NULL },
2f02809d32a8 URL is cdda://tracks[:speed][/device]
albeu
parents: 9656
diff changeset
102 { "noskip", &cdda_dflts.no_skip, CONF_TYPE_FLAG, 0 , 0, 1, NULL },
2f02809d32a8 URL is cdda://tracks[:speed][/device]
albeu
parents: 9656
diff changeset
103 { "skip", &cdda_dflts.no_skip, CONF_TYPE_FLAG, 0 , 1, 0, NULL },
2f02809d32a8 URL is cdda://tracks[:speed][/device]
albeu
parents: 9656
diff changeset
104 { "device", &cdda_dflts.device, CONF_TYPE_STRING, 0, 0, 0, NULL },
2f02809d32a8 URL is cdda://tracks[:speed][/device]
albeu
parents: 9656
diff changeset
105 { "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
106 {NULL, NULL, 0, 0, 0, 0, NULL}
f0b933918a22 Support for playing audio cds using cdparanoia. Include a raw audio
albeu
parents:
diff changeset
107 };
f0b933918a22 Support for playing audio cds using cdparanoia. Include a raw audio
albeu
parents:
diff changeset
108
28051
9e739bdb049c Get rid of pointless 'extern' keywords.
diego
parents: 27391
diff changeset
109 int cdd_identify(const char *dev);
9e739bdb049c Get rid of pointless 'extern' keywords.
diego
parents: 27391
diff changeset
110 int cddb_resolve(const char *dev, char **xmcd_file);
9e739bdb049c Get rid of pointless 'extern' keywords.
diego
parents: 27391
diff changeset
111 cd_info_t* cddb_parse_xmcd(char *xmcd_file);
9801
2f02809d32a8 URL is cdda://tracks[:speed][/device]
albeu
parents: 9656
diff changeset
112
2f02809d32a8 URL is cdda://tracks[:speed][/device]
albeu
parents: 9656
diff changeset
113 static int seek(stream_t* s,off_t pos);
2f02809d32a8 URL is cdda://tracks[:speed][/device]
albeu
parents: 9656
diff changeset
114 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
115 static void close_cdda(stream_t* s);
9801
2f02809d32a8 URL is cdda://tracks[:speed][/device]
albeu
parents: 9656
diff changeset
116
25410
38ef388859a9 Add cdda stream control for chapter commmands.
ulion
parents: 25396
diff changeset
117 static int get_track_by_sector(cdda_priv *p, unsigned int sector) {
38ef388859a9 Add cdda stream control for chapter commmands.
ulion
parents: 25396
diff changeset
118 int i;
38ef388859a9 Add cdda stream control for chapter commmands.
ulion
parents: 25396
diff changeset
119 for (i = p->cd->tracks; i >= 0 ; --i)
38ef388859a9 Add cdda stream control for chapter commmands.
ulion
parents: 25396
diff changeset
120 if (p->cd->disc_toc[i].dwStartSector <= sector)
38ef388859a9 Add cdda stream control for chapter commmands.
ulion
parents: 25396
diff changeset
121 break;
38ef388859a9 Add cdda stream control for chapter commmands.
ulion
parents: 25396
diff changeset
122 return i;
38ef388859a9 Add cdda stream control for chapter commmands.
ulion
parents: 25396
diff changeset
123 }
38ef388859a9 Add cdda stream control for chapter commmands.
ulion
parents: 25396
diff changeset
124
38ef388859a9 Add cdda stream control for chapter commmands.
ulion
parents: 25396
diff changeset
125 static int control(stream_t *stream, int cmd, void *arg) {
38ef388859a9 Add cdda stream control for chapter commmands.
ulion
parents: 25396
diff changeset
126 cdda_priv* p = stream->priv;
38ef388859a9 Add cdda stream control for chapter commmands.
ulion
parents: 25396
diff changeset
127 switch(cmd) {
38ef388859a9 Add cdda stream control for chapter commmands.
ulion
parents: 25396
diff changeset
128 case STREAM_CTRL_GET_NUM_CHAPTERS:
38ef388859a9 Add cdda stream control for chapter commmands.
ulion
parents: 25396
diff changeset
129 {
38ef388859a9 Add cdda stream control for chapter commmands.
ulion
parents: 25396
diff changeset
130 int start_track = get_track_by_sector(p, p->start_sector);
38ef388859a9 Add cdda stream control for chapter commmands.
ulion
parents: 25396
diff changeset
131 int end_track = get_track_by_sector(p, p->end_sector);
38ef388859a9 Add cdda stream control for chapter commmands.
ulion
parents: 25396
diff changeset
132 *(unsigned int *)arg = end_track + 1 - start_track;
38ef388859a9 Add cdda stream control for chapter commmands.
ulion
parents: 25396
diff changeset
133 return STREAM_OK;
38ef388859a9 Add cdda stream control for chapter commmands.
ulion
parents: 25396
diff changeset
134 }
38ef388859a9 Add cdda stream control for chapter commmands.
ulion
parents: 25396
diff changeset
135 case STREAM_CTRL_SEEK_TO_CHAPTER:
38ef388859a9 Add cdda stream control for chapter commmands.
ulion
parents: 25396
diff changeset
136 {
38ef388859a9 Add cdda stream control for chapter commmands.
ulion
parents: 25396
diff changeset
137 int r;
38ef388859a9 Add cdda stream control for chapter commmands.
ulion
parents: 25396
diff changeset
138 unsigned int track = *(unsigned int *)arg;
38ef388859a9 Add cdda stream control for chapter commmands.
ulion
parents: 25396
diff changeset
139 int start_track = get_track_by_sector(p, p->start_sector);
38ef388859a9 Add cdda stream control for chapter commmands.
ulion
parents: 25396
diff changeset
140 int seek_sector;
38ef388859a9 Add cdda stream control for chapter commmands.
ulion
parents: 25396
diff changeset
141 track += start_track;
38ef388859a9 Add cdda stream control for chapter commmands.
ulion
parents: 25396
diff changeset
142 if (track >= p->cd->tracks) {
38ef388859a9 Add cdda stream control for chapter commmands.
ulion
parents: 25396
diff changeset
143 stream->eof = 1;
38ef388859a9 Add cdda stream control for chapter commmands.
ulion
parents: 25396
diff changeset
144 return STREAM_ERROR;
38ef388859a9 Add cdda stream control for chapter commmands.
ulion
parents: 25396
diff changeset
145 }
38ef388859a9 Add cdda stream control for chapter commmands.
ulion
parents: 25396
diff changeset
146 seek_sector = track <= 0 ? p->start_sector
38ef388859a9 Add cdda stream control for chapter commmands.
ulion
parents: 25396
diff changeset
147 : p->cd->disc_toc[track].dwStartSector;
38ef388859a9 Add cdda stream control for chapter commmands.
ulion
parents: 25396
diff changeset
148 r = seek(stream, seek_sector * CD_FRAMESIZE_RAW);
38ef388859a9 Add cdda stream control for chapter commmands.
ulion
parents: 25396
diff changeset
149 if (r)
38ef388859a9 Add cdda stream control for chapter commmands.
ulion
parents: 25396
diff changeset
150 return STREAM_OK;
38ef388859a9 Add cdda stream control for chapter commmands.
ulion
parents: 25396
diff changeset
151 break;
38ef388859a9 Add cdda stream control for chapter commmands.
ulion
parents: 25396
diff changeset
152 }
38ef388859a9 Add cdda stream control for chapter commmands.
ulion
parents: 25396
diff changeset
153 case STREAM_CTRL_GET_CURRENT_CHAPTER:
38ef388859a9 Add cdda stream control for chapter commmands.
ulion
parents: 25396
diff changeset
154 {
38ef388859a9 Add cdda stream control for chapter commmands.
ulion
parents: 25396
diff changeset
155 int start_track = get_track_by_sector(p, p->start_sector);
38ef388859a9 Add cdda stream control for chapter commmands.
ulion
parents: 25396
diff changeset
156 int cur_track = get_track_by_sector(p, p->sector);
38ef388859a9 Add cdda stream control for chapter commmands.
ulion
parents: 25396
diff changeset
157 *(unsigned int *)arg = cur_track - start_track;
38ef388859a9 Add cdda stream control for chapter commmands.
ulion
parents: 25396
diff changeset
158 return STREAM_OK;
38ef388859a9 Add cdda stream control for chapter commmands.
ulion
parents: 25396
diff changeset
159 }
38ef388859a9 Add cdda stream control for chapter commmands.
ulion
parents: 25396
diff changeset
160 }
38ef388859a9 Add cdda stream control for chapter commmands.
ulion
parents: 25396
diff changeset
161 return STREAM_UNSUPPORTED;
38ef388859a9 Add cdda stream control for chapter commmands.
ulion
parents: 25396
diff changeset
162 }
38ef388859a9 Add cdda stream control for chapter commmands.
ulion
parents: 25396
diff changeset
163
9801
2f02809d32a8 URL is cdda://tracks[:speed][/device]
albeu
parents: 9656
diff changeset
164 static int open_cdda(stream_t *st,int m, void* opts, int* file_format) {
2f02809d32a8 URL is cdda://tracks[:speed][/device]
albeu
parents: 9656
diff changeset
165 struct cdda_params* p = (struct cdda_params*)opts;
2f02809d32a8 URL is cdda://tracks[:speed][/device]
albeu
parents: 9656
diff changeset
166 int mode = p->paranoia_mode;
2f02809d32a8 URL is cdda://tracks[:speed][/device]
albeu
parents: 9656
diff changeset
167 int offset = p->toc_offset;
27391
1d2faa1020fb Rename a bunch of miscellaneous preprocessor directives.
diego
parents: 25691
diff changeset
168 #ifndef CONFIG_LIBCDIO
6384
f0b933918a22 Support for playing audio cds using cdparanoia. Include a raw audio
albeu
parents:
diff changeset
169 cdrom_drive* cdd = NULL;
16935
60bd6aeed405 make it optionally possible to compile MPlayer with libcdio instead of libcdparanoia
faust3
parents: 16926
diff changeset
170 #else
60bd6aeed405 make it optionally possible to compile MPlayer with libcdio instead of libcdparanoia
faust3
parents: 16926
diff changeset
171 cdrom_drive_t* cdd = NULL;
60bd6aeed405 make it optionally possible to compile MPlayer with libcdio instead of libcdparanoia
faust3
parents: 16926
diff changeset
172 #endif
6384
f0b933918a22 Support for playing audio cds using cdparanoia. Include a raw audio
albeu
parents:
diff changeset
173 cdda_priv* priv;
9801
2f02809d32a8 URL is cdda://tracks[:speed][/device]
albeu
parents: 9656
diff changeset
174 cd_info_t *cd_info,*cddb_info = NULL;
6696
030e3fa9cf4a Build a fake list of track name.
bertrand
parents: 6384
diff changeset
175 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
176 int last_track;
6696
030e3fa9cf4a Build a fake list of track name.
bertrand
parents: 6384
diff changeset
177 int i;
9801
2f02809d32a8 URL is cdda://tracks[:speed][/device]
albeu
parents: 9656
diff changeset
178 char *xmcd_file = NULL;
6384
f0b933918a22 Support for playing audio cds using cdparanoia. Include a raw audio
albeu
parents:
diff changeset
179
9801
2f02809d32a8 URL is cdda://tracks[:speed][/device]
albeu
parents: 9656
diff changeset
180 if(m != STREAM_READ) {
2f02809d32a8 URL is cdda://tracks[:speed][/device]
albeu
parents: 9656
diff changeset
181 m_struct_free(&stream_opts,opts);
24257
d261f5109660 cosmetics: typo fix UNSUPORTED --> UNSUPPORTED
diego
parents: 21507
diff changeset
182 return STREAM_UNSUPPORTED;
9801
2f02809d32a8 URL is cdda://tracks[:speed][/device]
albeu
parents: 9656
diff changeset
183 }
6384
f0b933918a22 Support for playing audio cds using cdparanoia. Include a raw audio
albeu
parents:
diff changeset
184
10591
0d381b648b51 Fix -cdrom-device to work again with cdda and vcd.
albeu
parents: 10121
diff changeset
185 if(!p->device) {
0d381b648b51 Fix -cdrom-device to work again with cdda and vcd.
albeu
parents: 10121
diff changeset
186 if (cdrom_device)
0d381b648b51 Fix -cdrom-device to work again with cdda and vcd.
albeu
parents: 10121
diff changeset
187 p->device = strdup(cdrom_device);
0d381b648b51 Fix -cdrom-device to work again with cdda and vcd.
albeu
parents: 10121
diff changeset
188 else
0d381b648b51 Fix -cdrom-device to work again with cdda and vcd.
albeu
parents: 10121
diff changeset
189 p->device = strdup(DEFAULT_CDROM_DEVICE);
0d381b648b51 Fix -cdrom-device to work again with cdda and vcd.
albeu
parents: 10121
diff changeset
190 }
0d381b648b51 Fix -cdrom-device to work again with cdda and vcd.
albeu
parents: 10121
diff changeset
191
27391
1d2faa1020fb Rename a bunch of miscellaneous preprocessor directives.
diego
parents: 25691
diff changeset
192 #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
193 // 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
194 // 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
195 if(cdd_identify(p->device) >= 0 && strncmp(st->url,"cddb",4) == 0) {
9801
2f02809d32a8 URL is cdda://tracks[:speed][/device]
albeu
parents: 9656
diff changeset
196 i = cddb_resolve(p->device, &xmcd_file);
2f02809d32a8 URL is cdda://tracks[:speed][/device]
albeu
parents: 9656
diff changeset
197 if(i == 0) {
2f02809d32a8 URL is cdda://tracks[:speed][/device]
albeu
parents: 9656
diff changeset
198 cddb_info = cddb_parse_xmcd(xmcd_file);
2f02809d32a8 URL is cdda://tracks[:speed][/device]
albeu
parents: 9656
diff changeset
199 free(xmcd_file);
6384
f0b933918a22 Support for playing audio cds using cdparanoia. Include a raw audio
albeu
parents:
diff changeset
200 }
f0b933918a22 Support for playing audio cds using cdparanoia. Include a raw audio
albeu
parents:
diff changeset
201 }
9801
2f02809d32a8 URL is cdda://tracks[:speed][/device]
albeu
parents: 9656
diff changeset
202 #endif
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 28051
diff changeset
203
27391
1d2faa1020fb Rename a bunch of miscellaneous preprocessor directives.
diego
parents: 25691
diff changeset
204 #ifndef CONFIG_LIBCDIO
9801
2f02809d32a8 URL is cdda://tracks[:speed][/device]
albeu
parents: 9656
diff changeset
205 if(p->generic_dev)
2f02809d32a8 URL is cdda://tracks[:speed][/device]
albeu
parents: 9656
diff changeset
206 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
207 else
16935
60bd6aeed405 make it optionally possible to compile MPlayer with libcdio instead of libcdparanoia
faust3
parents: 16926
diff changeset
208 #endif
8958
56bf90cefb10 Removed the hardcoded /dev/cdrom for NetBSD and added an work around
bertrand
parents: 8609
diff changeset
209 #if defined(__NetBSD__)
9801
2f02809d32a8 URL is cdda://tracks[:speed][/device]
albeu
parents: 9656
diff changeset
210 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
211 #else
9801
2f02809d32a8 URL is cdda://tracks[:speed][/device]
albeu
parents: 9656
diff changeset
212 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
213 #endif
6384
f0b933918a22 Support for playing audio cds using cdparanoia. Include a raw audio
albeu
parents:
diff changeset
214
f0b933918a22 Support for playing audio cds using cdparanoia. Include a raw audio
albeu
parents:
diff changeset
215 if(!cdd) {
16967
32e2c59c8e86 [TRIVIAL] More translatables to help_mp and printfs to mp_msg on libmpdemux
reynaldo
parents: 16940
diff changeset
216 mp_msg(MSGT_OPEN,MSGL_ERR,MSGTR_MPDEMUX_CDDA_CantOpenCDDADevice);
9801
2f02809d32a8 URL is cdda://tracks[:speed][/device]
albeu
parents: 9656
diff changeset
217 m_struct_free(&stream_opts,opts);
18225
1e1398e6bdf9 resource leak fix.
gpoirier
parents: 17012
diff changeset
218 free(cddb_info);
9801
2f02809d32a8 URL is cdda://tracks[:speed][/device]
albeu
parents: 9656
diff changeset
219 return STREAM_ERROR;
6384
f0b933918a22 Support for playing audio cds using cdparanoia. Include a raw audio
albeu
parents:
diff changeset
220 }
f0b933918a22 Support for playing audio cds using cdparanoia. Include a raw audio
albeu
parents:
diff changeset
221
f0b933918a22 Support for playing audio cds using cdparanoia. Include a raw audio
albeu
parents:
diff changeset
222 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
223
9801
2f02809d32a8 URL is cdda://tracks[:speed][/device]
albeu
parents: 9656
diff changeset
224 if(p->sector_size) {
2f02809d32a8 URL is cdda://tracks[:speed][/device]
albeu
parents: 9656
diff changeset
225 cdd->nsectors = p->sector_size;
27391
1d2faa1020fb Rename a bunch of miscellaneous preprocessor directives.
diego
parents: 25691
diff changeset
226 #ifndef CONFIG_LIBCDIO
9801
2f02809d32a8 URL is cdda://tracks[:speed][/device]
albeu
parents: 9656
diff changeset
227 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
228 #endif
6384
f0b933918a22 Support for playing audio cds using cdparanoia. Include a raw audio
albeu
parents:
diff changeset
229 }
f0b933918a22 Support for playing audio cds using cdparanoia. Include a raw audio
albeu
parents:
diff changeset
230
f0b933918a22 Support for playing audio cds using cdparanoia. Include a raw audio
albeu
parents:
diff changeset
231 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
232 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
233 cdda_close(cdd);
9801
2f02809d32a8 URL is cdda://tracks[:speed][/device]
albeu
parents: 9656
diff changeset
234 m_struct_free(&stream_opts,opts);
18225
1e1398e6bdf9 resource leak fix.
gpoirier
parents: 17012
diff changeset
235 free(cddb_info);
9801
2f02809d32a8 URL is cdda://tracks[:speed][/device]
albeu
parents: 9656
diff changeset
236 return STREAM_ERROR;
6384
f0b933918a22 Support for playing audio cds using cdparanoia. Include a raw audio
albeu
parents:
diff changeset
237 }
f0b933918a22 Support for playing audio cds using cdparanoia. Include a raw audio
albeu
parents:
diff changeset
238
6696
030e3fa9cf4a Build a fake list of track name.
bertrand
parents: 6384
diff changeset
239 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
240 mp_msg(MSGT_OPEN,MSGL_INFO,MSGTR_MPDEMUX_CDDA_AudioCDFoundWithNTracks,cdda_tracks(cdd));
6696
030e3fa9cf4a Build a fake list of track name.
bertrand
parents: 6384
diff changeset
241 for(i=0;i<cdd->tracks;i++) {
030e3fa9cf4a Build a fake list of track name.
bertrand
parents: 6384
diff changeset
242 char track_name[80];
030e3fa9cf4a Build a fake list of track name.
bertrand
parents: 6384
diff changeset
243 long sec=cdda_track_firstsector(cdd,i+1);
030e3fa9cf4a Build a fake list of track name.
bertrand
parents: 6384
diff changeset
244 long off=cdda_track_lastsector(cdd,i+1)-sec+1;
030e3fa9cf4a Build a fake list of track name.
bertrand
parents: 6384
diff changeset
245
030e3fa9cf4a Build a fake list of track name.
bertrand
parents: 6384
diff changeset
246 sprintf(track_name, "Track %d", i+1);
030e3fa9cf4a Build a fake list of track name.
bertrand
parents: 6384
diff changeset
247 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 );
030e3fa9cf4a Build a fake list of track name.
bertrand
parents: 6384
diff changeset
248 audiolen += off;
030e3fa9cf4a Build a fake list of track name.
bertrand
parents: 6384
diff changeset
249 }
030e3fa9cf4a Build a fake list of track name.
bertrand
parents: 6384
diff changeset
250 cd_info->min = (unsigned int)(audiolen/(60*75));
030e3fa9cf4a Build a fake list of track name.
bertrand
parents: 6384
diff changeset
251 cd_info->sec = (unsigned int)((audiolen/75)%60);
030e3fa9cf4a Build a fake list of track name.
bertrand
parents: 6384
diff changeset
252 cd_info->msec = (unsigned int)(audiolen%75);
030e3fa9cf4a Build a fake list of track name.
bertrand
parents: 6384
diff changeset
253
19062
83c3afeab35d drops casts from void * on malloc/calloc from libmpdemux code
reynaldo
parents: 18922
diff changeset
254 priv = malloc(sizeof(cdda_priv));
6696
030e3fa9cf4a Build a fake list of track name.
bertrand
parents: 6384
diff changeset
255 memset(priv, 0, sizeof(cdda_priv));
6384
f0b933918a22 Support for playing audio cds using cdparanoia. Include a raw audio
albeu
parents:
diff changeset
256 priv->cd = cdd;
6696
030e3fa9cf4a Build a fake list of track name.
bertrand
parents: 6384
diff changeset
257 priv->cd_info = cd_info;
6384
f0b933918a22 Support for playing audio cds using cdparanoia. Include a raw audio
albeu
parents:
diff changeset
258
9801
2f02809d32a8 URL is cdda://tracks[:speed][/device]
albeu
parents: 9656
diff changeset
259 if(p->toc_bias)
6384
f0b933918a22 Support for playing audio cds using cdparanoia. Include a raw audio
albeu
parents:
diff changeset
260 offset -= cdda_track_firstsector(cdd,1);
f0b933918a22 Support for playing audio cds using cdparanoia. Include a raw audio
albeu
parents:
diff changeset
261
f0b933918a22 Support for playing audio cds using cdparanoia. Include a raw audio
albeu
parents:
diff changeset
262 if(offset) {
f0b933918a22 Support for playing audio cds using cdparanoia. Include a raw audio
albeu
parents:
diff changeset
263 int i;
f0b933918a22 Support for playing audio cds using cdparanoia. Include a raw audio
albeu
parents:
diff changeset
264 for(i = 0 ; i < cdd->tracks + 1 ; i++)
f0b933918a22 Support for playing audio cds using cdparanoia. Include a raw audio
albeu
parents:
diff changeset
265 cdd->disc_toc[i].dwStartSector += offset;
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
9801
2f02809d32a8 URL is cdda://tracks[:speed][/device]
albeu
parents: 9656
diff changeset
268 if(p->speed)
2f02809d32a8 URL is cdda://tracks[:speed][/device]
albeu
parents: 9656
diff changeset
269 cdda_speed_set(cdd,p->speed);
6384
f0b933918a22 Support for playing audio cds using cdparanoia. Include a raw audio
albeu
parents:
diff changeset
270
16926
24c52f2c3aa9 fix cdda://n syntax: do not hang when n > nr_tracks and play only track n,
reimar
parents: 16914
diff changeset
271 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
272 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
273 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
274 if (p->span.end > last_track) p->span.end = last_track;
9801
2f02809d32a8 URL is cdda://tracks[:speed][/device]
albeu
parents: 9656
diff changeset
275 if(p->span.start)
2f02809d32a8 URL is cdda://tracks[:speed][/device]
albeu
parents: 9656
diff changeset
276 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
277 else
f0b933918a22 Support for playing audio cds using cdparanoia. Include a raw audio
albeu
parents:
diff changeset
278 priv->start_sector = cdda_disc_firstsector(cdd);
f0b933918a22 Support for playing audio cds using cdparanoia. Include a raw audio
albeu
parents:
diff changeset
279
9801
2f02809d32a8 URL is cdda://tracks[:speed][/device]
albeu
parents: 9656
diff changeset
280 if(p->span.end) {
2f02809d32a8 URL is cdda://tracks[:speed][/device]
albeu
parents: 9656
diff changeset
281 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
282 } else
f0b933918a22 Support for playing audio cds using cdparanoia. Include a raw audio
albeu
parents:
diff changeset
283 priv->end_sector = cdda_disc_lastsector(cdd);
f0b933918a22 Support for playing audio cds using cdparanoia. Include a raw audio
albeu
parents:
diff changeset
284
f0b933918a22 Support for playing audio cds using cdparanoia. Include a raw audio
albeu
parents:
diff changeset
285 priv->cdp = paranoia_init(cdd);
f0b933918a22 Support for playing audio cds using cdparanoia. Include a raw audio
albeu
parents:
diff changeset
286 if(priv->cdp == NULL) {
f0b933918a22 Support for playing audio cds using cdparanoia. Include a raw audio
albeu
parents:
diff changeset
287 cdda_close(cdd);
f0b933918a22 Support for playing audio cds using cdparanoia. Include a raw audio
albeu
parents:
diff changeset
288 free(priv);
9801
2f02809d32a8 URL is cdda://tracks[:speed][/device]
albeu
parents: 9656
diff changeset
289 cd_info_free(cd_info);
2f02809d32a8 URL is cdda://tracks[:speed][/device]
albeu
parents: 9656
diff changeset
290 m_struct_free(&stream_opts,opts);
18225
1e1398e6bdf9 resource leak fix.
gpoirier
parents: 17012
diff changeset
291 free(cddb_info);
9801
2f02809d32a8 URL is cdda://tracks[:speed][/device]
albeu
parents: 9656
diff changeset
292 return STREAM_ERROR;
6384
f0b933918a22 Support for playing audio cds using cdparanoia. Include a raw audio
albeu
parents:
diff changeset
293 }
f0b933918a22 Support for playing audio cds using cdparanoia. Include a raw audio
albeu
parents:
diff changeset
294
f0b933918a22 Support for playing audio cds using cdparanoia. Include a raw audio
albeu
parents:
diff changeset
295 if(mode == 0)
f0b933918a22 Support for playing audio cds using cdparanoia. Include a raw audio
albeu
parents:
diff changeset
296 mode = PARANOIA_MODE_DISABLE;
f0b933918a22 Support for playing audio cds using cdparanoia. Include a raw audio
albeu
parents:
diff changeset
297 else if(mode == 1)
f0b933918a22 Support for playing audio cds using cdparanoia. Include a raw audio
albeu
parents:
diff changeset
298 mode = PARANOIA_MODE_OVERLAP;
f0b933918a22 Support for playing audio cds using cdparanoia. Include a raw audio
albeu
parents:
diff changeset
299 else
f0b933918a22 Support for playing audio cds using cdparanoia. Include a raw audio
albeu
parents:
diff changeset
300 mode = PARANOIA_MODE_FULL;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 28051
diff changeset
301
9801
2f02809d32a8 URL is cdda://tracks[:speed][/device]
albeu
parents: 9656
diff changeset
302 if(p->no_skip)
6384
f0b933918a22 Support for playing audio cds using cdparanoia. Include a raw audio
albeu
parents:
diff changeset
303 mode |= PARANOIA_MODE_NEVERSKIP;
27391
1d2faa1020fb Rename a bunch of miscellaneous preprocessor directives.
diego
parents: 25691
diff changeset
304 #ifndef CONFIG_LIBCDIO
16635
8fd80915d2a2 10l, forgotten call to paranoia_modeset to actually set the desired mode.
reimar
parents: 16524
diff changeset
305 paranoia_modeset(cdd, mode);
6384
f0b933918a22 Support for playing audio cds using cdparanoia. Include a raw audio
albeu
parents:
diff changeset
306
9801
2f02809d32a8 URL is cdda://tracks[:speed][/device]
albeu
parents: 9656
diff changeset
307 if(p->search_overlap >= 0)
2f02809d32a8 URL is cdda://tracks[:speed][/device]
albeu
parents: 9656
diff changeset
308 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
309 #else
60bd6aeed405 make it optionally possible to compile MPlayer with libcdio instead of libcdparanoia
faust3
parents: 16926
diff changeset
310 paranoia_modeset(priv->cdp, mode);
60bd6aeed405 make it optionally possible to compile MPlayer with libcdio instead of libcdparanoia
faust3
parents: 16926
diff changeset
311
60bd6aeed405 make it optionally possible to compile MPlayer with libcdio instead of libcdparanoia
faust3
parents: 16926
diff changeset
312 if(p->search_overlap >= 0)
60bd6aeed405 make it optionally possible to compile MPlayer with libcdio instead of libcdparanoia
faust3
parents: 16926
diff changeset
313 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
314 #endif
6384
f0b933918a22 Support for playing audio cds using cdparanoia. Include a raw audio
albeu
parents:
diff changeset
315
f0b933918a22 Support for playing audio cds using cdparanoia. Include a raw audio
albeu
parents:
diff changeset
316 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
317 priv->sector = priv->start_sector;
f0b933918a22 Support for playing audio cds using cdparanoia. Include a raw audio
albeu
parents:
diff changeset
318
27391
1d2faa1020fb Rename a bunch of miscellaneous preprocessor directives.
diego
parents: 25691
diff changeset
319 #ifdef CONFIG_CDDB
9801
2f02809d32a8 URL is cdda://tracks[:speed][/device]
albeu
parents: 9656
diff changeset
320 if(cddb_info) {
2f02809d32a8 URL is cdda://tracks[:speed][/device]
albeu
parents: 9656
diff changeset
321 cd_info_free(cd_info);
2f02809d32a8 URL is cdda://tracks[:speed][/device]
albeu
parents: 9656
diff changeset
322 priv->cd_info = cddb_info;
2f02809d32a8 URL is cdda://tracks[:speed][/device]
albeu
parents: 9656
diff changeset
323 cd_info_debug( cddb_info );
2f02809d32a8 URL is cdda://tracks[:speed][/device]
albeu
parents: 9656
diff changeset
324 }
2f02809d32a8 URL is cdda://tracks[:speed][/device]
albeu
parents: 9656
diff changeset
325 #endif
2f02809d32a8 URL is cdda://tracks[:speed][/device]
albeu
parents: 9656
diff changeset
326
6384
f0b933918a22 Support for playing audio cds using cdparanoia. Include a raw audio
albeu
parents:
diff changeset
327 st->priv = priv;
f0b933918a22 Support for playing audio cds using cdparanoia. Include a raw audio
albeu
parents:
diff changeset
328 st->start_pos = priv->start_sector*CD_FRAMESIZE_RAW;
25382
25b27cf5bbeb Make the end_sector accessable (it should be).
ulion
parents: 25365
diff changeset
329 st->end_pos = (priv->end_sector + 1) * CD_FRAMESIZE_RAW;
9801
2f02809d32a8 URL is cdda://tracks[:speed][/device]
albeu
parents: 9656
diff changeset
330 st->type = STREAMTYPE_CDDA;
2f02809d32a8 URL is cdda://tracks[:speed][/device]
albeu
parents: 9656
diff changeset
331 st->sector_size = CD_FRAMESIZE_RAW;
6384
f0b933918a22 Support for playing audio cds using cdparanoia. Include a raw audio
albeu
parents:
diff changeset
332
9801
2f02809d32a8 URL is cdda://tracks[:speed][/device]
albeu
parents: 9656
diff changeset
333 st->fill_buffer = fill_buffer;
2f02809d32a8 URL is cdda://tracks[:speed][/device]
albeu
parents: 9656
diff changeset
334 st->seek = seek;
25410
38ef388859a9 Add cdda stream control for chapter commmands.
ulion
parents: 25396
diff changeset
335 st->control = control;
16935
60bd6aeed405 make it optionally possible to compile MPlayer with libcdio instead of libcdparanoia
faust3
parents: 16926
diff changeset
336 st->close = close_cdda;
9801
2f02809d32a8 URL is cdda://tracks[:speed][/device]
albeu
parents: 9656
diff changeset
337
2f02809d32a8 URL is cdda://tracks[:speed][/device]
albeu
parents: 9656
diff changeset
338 *file_format = DEMUXER_TYPE_RAWAUDIO;
2f02809d32a8 URL is cdda://tracks[:speed][/device]
albeu
parents: 9656
diff changeset
339
2f02809d32a8 URL is cdda://tracks[:speed][/device]
albeu
parents: 9656
diff changeset
340 m_struct_free(&stream_opts,opts);
2f02809d32a8 URL is cdda://tracks[:speed][/device]
albeu
parents: 9656
diff changeset
341
2f02809d32a8 URL is cdda://tracks[:speed][/device]
albeu
parents: 9656
diff changeset
342 return STREAM_OK;
6384
f0b933918a22 Support for playing audio cds using cdparanoia. Include a raw audio
albeu
parents:
diff changeset
343 }
f0b933918a22 Support for playing audio cds using cdparanoia. Include a raw audio
albeu
parents:
diff changeset
344
27391
1d2faa1020fb Rename a bunch of miscellaneous preprocessor directives.
diego
parents: 25691
diff changeset
345 #ifndef CONFIG_LIBCDIO
6384
f0b933918a22 Support for playing audio cds using cdparanoia. Include a raw audio
albeu
parents:
diff changeset
346 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
347 #else
60bd6aeed405 make it optionally possible to compile MPlayer with libcdio instead of libcdparanoia
faust3
parents: 16926
diff changeset
348 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
349 #endif
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
9801
2f02809d32a8 URL is cdda://tracks[:speed][/device]
albeu
parents: 9656
diff changeset
352 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
353 cdda_priv* p = (cdda_priv*)s->priv;
6696
030e3fa9cf4a Build a fake list of track name.
bertrand
parents: 6384
diff changeset
354 cd_track_t *cd_track;
6384
f0b933918a22 Support for playing audio cds using cdparanoia. Include a raw audio
albeu
parents:
diff changeset
355 int16_t * buf;
9801
2f02809d32a8 URL is cdda://tracks[:speed][/device]
albeu
parents: 9656
diff changeset
356 int i;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 28051
diff changeset
357
25382
25b27cf5bbeb Make the end_sector accessable (it should be).
ulion
parents: 25365
diff changeset
358 if((p->sector < p->start_sector) || (p->sector > p->end_sector)) {
25b27cf5bbeb Make the end_sector accessable (it should be).
ulion
parents: 25365
diff changeset
359 s->eof = 1;
25b27cf5bbeb Make the end_sector accessable (it should be).
ulion
parents: 25365
diff changeset
360 return 0;
25b27cf5bbeb Make the end_sector accessable (it should be).
ulion
parents: 25365
diff changeset
361 }
25b27cf5bbeb Make the end_sector accessable (it should be).
ulion
parents: 25365
diff changeset
362
6384
f0b933918a22 Support for playing audio cds using cdparanoia. Include a raw audio
albeu
parents:
diff changeset
363 buf = paranoia_read(p->cdp,cdparanoia_callback);
20195
32a550c28268 bails out if cdparanoia can't read cd (avoid lockup)
ben
parents: 19312
diff changeset
364 if (!buf)
32a550c28268 bails out if cdparanoia can't read cd (avoid lockup)
ben
parents: 19312
diff changeset
365 return 0;
6384
f0b933918a22 Support for playing audio cds using cdparanoia. Include a raw audio
albeu
parents:
diff changeset
366
29401
f01023c524c3 Replace WORDS_BIGENDIAN by HAVE_BIGENDIAN in all internal code.
diego
parents: 29263
diff changeset
367 #if HAVE_BIGENDIAN
11652
b846d0a788c1 cdda: endianness fix
colin
parents: 10591
diff changeset
368 for(i=0;i<CD_FRAMESIZE_RAW/2;i++)
b846d0a788c1 cdda: endianness fix
colin
parents: 10591
diff changeset
369 buf[i]=le2me_16(buf[i]);
b846d0a788c1 cdda: endianness fix
colin
parents: 10591
diff changeset
370 #endif
b846d0a788c1 cdda: endianness fix
colin
parents: 10591
diff changeset
371
6384
f0b933918a22 Support for playing audio cds using cdparanoia. Include a raw audio
albeu
parents:
diff changeset
372 p->sector++;
9801
2f02809d32a8 URL is cdda://tracks[:speed][/device]
albeu
parents: 9656
diff changeset
373 memcpy(buffer,buf,CD_FRAMESIZE_RAW);
6384
f0b933918a22 Support for playing audio cds using cdparanoia. Include a raw audio
albeu
parents:
diff changeset
374
6696
030e3fa9cf4a Build a fake list of track name.
bertrand
parents: 6384
diff changeset
375 for(i=0;i<p->cd->tracks;i++){
030e3fa9cf4a Build a fake list of track name.
bertrand
parents: 6384
diff changeset
376 if(p->cd->disc_toc[i].dwStartSector==p->sector-1) {
030e3fa9cf4a Build a fake list of track name.
bertrand
parents: 6384
diff changeset
377 cd_track = cd_info_get_track(p->cd_info, i+1);
030e3fa9cf4a Build a fake list of track name.
bertrand
parents: 6384
diff changeset
378 //printf("Track %d, sector=%d\n", i, p->sector-1);
030e3fa9cf4a Build a fake list of track name.
bertrand
parents: 6384
diff changeset
379 if( cd_track!=NULL ) {
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 28051
diff changeset
380 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
381 mp_msg(MSGT_IDENTIFY, MSGL_INFO, "ID_CDDA_TRACK=%d\n", cd_track->track_nb);
6696
030e3fa9cf4a Build a fake list of track name.
bertrand
parents: 6384
diff changeset
382 }
030e3fa9cf4a Build a fake list of track name.
bertrand
parents: 6384
diff changeset
383 break;
030e3fa9cf4a Build a fake list of track name.
bertrand
parents: 6384
diff changeset
384 }
030e3fa9cf4a Build a fake list of track name.
bertrand
parents: 6384
diff changeset
385 }
030e3fa9cf4a Build a fake list of track name.
bertrand
parents: 6384
diff changeset
386
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 28051
diff changeset
387
6384
f0b933918a22 Support for playing audio cds using cdparanoia. Include a raw audio
albeu
parents:
diff changeset
388 return CD_FRAMESIZE_RAW;
f0b933918a22 Support for playing audio cds using cdparanoia. Include a raw audio
albeu
parents:
diff changeset
389 }
f0b933918a22 Support for playing audio cds using cdparanoia. Include a raw audio
albeu
parents:
diff changeset
390
9801
2f02809d32a8 URL is cdda://tracks[:speed][/device]
albeu
parents: 9656
diff changeset
391 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
392 cdda_priv* p = (cdda_priv*)s->priv;
6696
030e3fa9cf4a Build a fake list of track name.
bertrand
parents: 6384
diff changeset
393 cd_track_t *cd_track;
030e3fa9cf4a Build a fake list of track name.
bertrand
parents: 6384
diff changeset
394 int sec;
030e3fa9cf4a Build a fake list of track name.
bertrand
parents: 6384
diff changeset
395 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
396 int seek_to_track = 0;
6696
030e3fa9cf4a Build a fake list of track name.
bertrand
parents: 6384
diff changeset
397 int i;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 28051
diff changeset
398
9801
2f02809d32a8 URL is cdda://tracks[:speed][/device]
albeu
parents: 9656
diff changeset
399 s->pos = newpos;
25362
74fbb5173956 Fix stream cdda seeks to CD's end and hangs forever bug.
ulion
parents: 25242
diff changeset
400 sec = s->pos/CD_FRAMESIZE_RAW;
25382
25b27cf5bbeb Make the end_sector accessable (it should be).
ulion
parents: 25365
diff changeset
401 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
402 s->eof = 1;
9801
2f02809d32a8 URL is cdda://tracks[:speed][/device]
albeu
parents: 9656
diff changeset
403 return 0;
9656
ef5ae9f9c6e6 fixed trivial seeking bugs, patch by Krister Lagerstrom <krister@kmlager.com>
alex
parents: 8958
diff changeset
404 }
6384
f0b933918a22 Support for playing audio cds using cdparanoia. Include a raw audio
albeu
parents:
diff changeset
405
8524
fe542f0201ea CDDA seeking fixed
arpi
parents: 7867
diff changeset
406 //printf("pos: %d, sec: %d ## %d\n", (int)s->pos, (int)sec, CD_FRAMESIZE_RAW);
fe542f0201ea CDDA seeking fixed
arpi
parents: 7867
diff changeset
407 //printf("sector: %d new: %d\n", p->sector, sec );
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 28051
diff changeset
408
6696
030e3fa9cf4a Build a fake list of track name.
bertrand
parents: 6384
diff changeset
409 for(i=0;i<p->cd->tracks;i++){
8559
arpi
parents: 8558
diff changeset
410 // printf("trk #%d: %d .. %d\n",i,p->cd->disc_toc[i].dwStartSector,p->cd->disc_toc[i+1].dwStartSector);
8524
fe542f0201ea CDDA seeking fixed
arpi
parents: 7867
diff changeset
411 if( p->sector>=p->cd->disc_toc[i].dwStartSector && p->sector<p->cd->disc_toc[i+1].dwStartSector ) {
6696
030e3fa9cf4a Build a fake list of track name.
bertrand
parents: 6384
diff changeset
412 current_track = i;
030e3fa9cf4a Build a fake list of track name.
bertrand
parents: 6384
diff changeset
413 }
8524
fe542f0201ea CDDA seeking fixed
arpi
parents: 7867
diff changeset
414 if( sec>=p->cd->disc_toc[i].dwStartSector && sec<p->cd->disc_toc[i+1].dwStartSector ) {
6696
030e3fa9cf4a Build a fake list of track name.
bertrand
parents: 6384
diff changeset
415 seeked_track = i;
25365
b57179296e5a Only print one track info when exactly seeking to the beginning of a track.
ulion
parents: 25362
diff changeset
416 seek_to_track = sec == p->cd->disc_toc[i].dwStartSector;
6696
030e3fa9cf4a Build a fake list of track name.
bertrand
parents: 6384
diff changeset
417 }
030e3fa9cf4a Build a fake list of track name.
bertrand
parents: 6384
diff changeset
418 }
030e3fa9cf4a Build a fake list of track name.
bertrand
parents: 6384
diff changeset
419 //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
420 if (current_track != seeked_track && !seek_to_track) {
6696
030e3fa9cf4a Build a fake list of track name.
bertrand
parents: 6384
diff changeset
421 //printf("Track %d, sector=%d\n", seeked_track, sec);
030e3fa9cf4a Build a fake list of track name.
bertrand
parents: 6384
diff changeset
422 cd_track = cd_info_get_track(p->cd_info, seeked_track+1);
030e3fa9cf4a Build a fake list of track name.
bertrand
parents: 6384
diff changeset
423 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
424 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
425 mp_msg(MSGT_IDENTIFY, MSGL_INFO, "ID_CDDA_TRACK=%d\n", cd_track->track_nb);
6696
030e3fa9cf4a Build a fake list of track name.
bertrand
parents: 6384
diff changeset
426 }
030e3fa9cf4a Build a fake list of track name.
bertrand
parents: 6384
diff changeset
427
030e3fa9cf4a Build a fake list of track name.
bertrand
parents: 6384
diff changeset
428 }
8524
fe542f0201ea CDDA seeking fixed
arpi
parents: 7867
diff changeset
429 #if 0
6384
f0b933918a22 Support for playing audio cds using cdparanoia. Include a raw audio
albeu
parents:
diff changeset
430 if(sec < p->start_sector)
f0b933918a22 Support for playing audio cds using cdparanoia. Include a raw audio
albeu
parents:
diff changeset
431 sec = p->start_sector;
f0b933918a22 Support for playing audio cds using cdparanoia. Include a raw audio
albeu
parents:
diff changeset
432 else if(sec > p->end_sector)
f0b933918a22 Support for playing audio cds using cdparanoia. Include a raw audio
albeu
parents:
diff changeset
433 sec = p->end_sector;
8524
fe542f0201ea CDDA seeking fixed
arpi
parents: 7867
diff changeset
434 #endif
6384
f0b933918a22 Support for playing audio cds using cdparanoia. Include a raw audio
albeu
parents:
diff changeset
435
f0b933918a22 Support for playing audio cds using cdparanoia. Include a raw audio
albeu
parents:
diff changeset
436 p->sector = sec;
6696
030e3fa9cf4a Build a fake list of track name.
bertrand
parents: 6384
diff changeset
437 // s->pos = sec*CD_FRAMESIZE_RAW;
6384
f0b933918a22 Support for playing audio cds using cdparanoia. Include a raw audio
albeu
parents:
diff changeset
438
8524
fe542f0201ea CDDA seeking fixed
arpi
parents: 7867
diff changeset
439 //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
440 paranoia_seek(p->cdp,sec,SEEK_SET);
9801
2f02809d32a8 URL is cdda://tracks[:speed][/device]
albeu
parents: 9656
diff changeset
441 return 1;
6384
f0b933918a22 Support for playing audio cds using cdparanoia. Include a raw audio
albeu
parents:
diff changeset
442 }
f0b933918a22 Support for playing audio cds using cdparanoia. Include a raw audio
albeu
parents:
diff changeset
443
16935
60bd6aeed405 make it optionally possible to compile MPlayer with libcdio instead of libcdparanoia
faust3
parents: 16926
diff changeset
444 static void close_cdda(stream_t* s) {
6384
f0b933918a22 Support for playing audio cds using cdparanoia. Include a raw audio
albeu
parents:
diff changeset
445 cdda_priv* p = (cdda_priv*)s->priv;
f0b933918a22 Support for playing audio cds using cdparanoia. Include a raw audio
albeu
parents:
diff changeset
446 paranoia_free(p->cdp);
f0b933918a22 Support for playing audio cds using cdparanoia. Include a raw audio
albeu
parents:
diff changeset
447 cdda_close(p->cd);
9801
2f02809d32a8 URL is cdda://tracks[:speed][/device]
albeu
parents: 9656
diff changeset
448 cd_info_free(p->cd_info);
2f02809d32a8 URL is cdda://tracks[:speed][/device]
albeu
parents: 9656
diff changeset
449 free(p);
6384
f0b933918a22 Support for playing audio cds using cdparanoia. Include a raw audio
albeu
parents:
diff changeset
450 }
f0b933918a22 Support for playing audio cds using cdparanoia. Include a raw audio
albeu
parents:
diff changeset
451
25211
c1d17bd6683c Mark all stream_info_t as const
reimar
parents: 24257
diff changeset
452 const stream_info_t stream_info_cdda = {
9801
2f02809d32a8 URL is cdda://tracks[:speed][/device]
albeu
parents: 9656
diff changeset
453 "CDDA",
2f02809d32a8 URL is cdda://tracks[:speed][/device]
albeu
parents: 9656
diff changeset
454 "cdda",
2f02809d32a8 URL is cdda://tracks[:speed][/device]
albeu
parents: 9656
diff changeset
455 "Albeu",
2f02809d32a8 URL is cdda://tracks[:speed][/device]
albeu
parents: 9656
diff changeset
456 "",
2f02809d32a8 URL is cdda://tracks[:speed][/device]
albeu
parents: 9656
diff changeset
457 open_cdda,
21479
edfd292bbf9e Add full support for en-/disabling cddb support
reimar
parents: 21418
diff changeset
458 { "cdda",
27391
1d2faa1020fb Rename a bunch of miscellaneous preprocessor directives.
diego
parents: 25691
diff changeset
459 #ifdef CONFIG_CDDB
21479
edfd292bbf9e Add full support for en-/disabling cddb support
reimar
parents: 21418
diff changeset
460 "cddb",
edfd292bbf9e Add full support for en-/disabling cddb support
reimar
parents: 21418
diff changeset
461 #endif
edfd292bbf9e Add full support for en-/disabling cddb support
reimar
parents: 21418
diff changeset
462 NULL },
9801
2f02809d32a8 URL is cdda://tracks[:speed][/device]
albeu
parents: 9656
diff changeset
463 &stream_opts,
2f02809d32a8 URL is cdda://tracks[:speed][/device]
albeu
parents: 9656
diff changeset
464 1 // Urls are an option string
2f02809d32a8 URL is cdda://tracks[:speed][/device]
albeu
parents: 9656
diff changeset
465 };