annotate stream/stream_cddb.c @ 36915:91ec74c16463

Fix typo.
author ib
date Thu, 13 Mar 2014 15:42:10 +0000
parents 85b5f38299fb
children ef0fa4caac9c
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
6474
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
1 /*
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 28402
diff changeset
2 * CDDB HTTP protocol
30426
ce0122361a39 Add license header to all files missing it in the stream subdirectory.
diego
parents: 29263
diff changeset
3 *
ce0122361a39 Add license header to all files missing it in the stream subdirectory.
diego
parents: 29263
diff changeset
4 * Copyright (C) 2002 Bertrand Baudet <bertrand_baudet@yahoo.com>
6474
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
5 *
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
6 * Implementation follow the freedb.howto1.06.txt specification
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
7 * from http://freedb.freedb.org
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 28402
diff changeset
8 *
6474
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
9 * discid computation by Jeremy D. Zawodny
30629
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
10 * Copyright (c) 1998-2000 Jeremy D. Zawodny <Jeremy@Zawodny.com>
30426
ce0122361a39 Add license header to all files missing it in the stream subdirectory.
diego
parents: 29263
diff changeset
11 *
ce0122361a39 Add license header to all files missing it in the stream subdirectory.
diego
parents: 29263
diff changeset
12 * This file is part of MPlayer.
ce0122361a39 Add license header to all files missing it in the stream subdirectory.
diego
parents: 29263
diff changeset
13 *
ce0122361a39 Add license header to all files missing it in the stream subdirectory.
diego
parents: 29263
diff changeset
14 * 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: 29263
diff changeset
15 * 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: 29263
diff changeset
16 * 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: 29263
diff changeset
17 * (at your option) any later version.
6474
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
18 *
30426
ce0122361a39 Add license header to all files missing it in the stream subdirectory.
diego
parents: 29263
diff changeset
19 * 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: 29263
diff changeset
20 * 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: 29263
diff changeset
21 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
ce0122361a39 Add license header to all files missing it in the stream subdirectory.
diego
parents: 29263
diff changeset
22 * GNU General Public License for more details.
ce0122361a39 Add license header to all files missing it in the stream subdirectory.
diego
parents: 29263
diff changeset
23 *
ce0122361a39 Add license header to all files missing it in the stream subdirectory.
diego
parents: 29263
diff changeset
24 * 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: 29263
diff changeset
25 * 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: 29263
diff changeset
26 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
6474
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
27 */
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
28
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
29 #include "config.h"
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
30
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
31 #include <stdio.h>
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
32 #include <stdlib.h>
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
33 #include <fcntl.h>
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
34 #include <stdarg.h>
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
35 #include <errno.h>
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
36 #include <unistd.h>
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
37 #include <string.h>
25792
0bf5384fb82c Fix compilation failue:
ulion
parents: 25780
diff changeset
38 #include <limits.h>
27727
48c1ae64255b Replace preprocessor check for WIN32 with checks for __MINGW32__ and __CYGWIN__.
diego
parents: 27461
diff changeset
39 #if defined(__MINGW32__) || defined(__CYGWIN__)
16935
60bd6aeed405 make it optionally possible to compile MPlayer with libcdio instead of libcdparanoia
faust3
parents: 16524
diff changeset
40 #ifdef __MINGW32__
33362
bf3f244d7bc1 Missing header for compilation in mingw.
vayne
parents: 32511
diff changeset
41 #include <path.h>
16935
60bd6aeed405 make it optionally possible to compile MPlayer with libcdio instead of libcdparanoia
faust3
parents: 16524
diff changeset
42 #define mkdir(a,b) mkdir(a)
60bd6aeed405 make it optionally possible to compile MPlayer with libcdio instead of libcdparanoia
faust3
parents: 16524
diff changeset
43 #endif
60bd6aeed405 make it optionally possible to compile MPlayer with libcdio instead of libcdparanoia
faust3
parents: 16524
diff changeset
44 #include <windows.h>
28402
c884d17bd005 Convert HAVE_WINSOCK2_H into a 0/1 definition.
diego
parents: 27727
diff changeset
45 #if HAVE_WINSOCK2_H
16935
60bd6aeed405 make it optionally possible to compile MPlayer with libcdio instead of libcdparanoia
faust3
parents: 16524
diff changeset
46 #include <winsock2.h>
17446
9604131f9196 Cygwin compilation fix
diego
parents: 17044
diff changeset
47 #endif
16935
60bd6aeed405 make it optionally possible to compile MPlayer with libcdio instead of libcdparanoia
faust3
parents: 16524
diff changeset
48 #else
60bd6aeed405 make it optionally possible to compile MPlayer with libcdio instead of libcdparanoia
faust3
parents: 16524
diff changeset
49 #include <netdb.h>
6474
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
50 #include <sys/ioctl.h>
16935
60bd6aeed405 make it optionally possible to compile MPlayer with libcdio instead of libcdparanoia
faust3
parents: 16524
diff changeset
51 #endif
6474
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
52 #include <sys/types.h>
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
53 #include <sys/stat.h>
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
54
16967
32e2c59c8e86 [TRIVIAL] More translatables to help_mp and printfs to mp_msg on libmpdemux
reynaldo
parents: 16935
diff changeset
55 #include "mp_msg.h"
32e2c59c8e86 [TRIVIAL] More translatables to help_mp and printfs to mp_msg on libmpdemux
reynaldo
parents: 16935
diff changeset
56 #include "help_mp.h"
32e2c59c8e86 [TRIVIAL] More translatables to help_mp and printfs to mp_msg on libmpdemux
reynaldo
parents: 16935
diff changeset
57
6474
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
58 #if defined(__linux__)
30629
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
59 #include <linux/cdrom.h>
21848
3ff1eade91f9 GNU/kFreeBSD support, closes Bugzilla #704.
diego
parents: 20587
diff changeset
60 #elif defined(__FreeBSD__) || defined(__FreeBSD_kernel__) || defined(__NetBSD__) || defined(__OpenBSD__) || defined(__DragonFly__)
30629
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
61 #include <sys/cdio.h>
27727
48c1ae64255b Replace preprocessor check for WIN32 with checks for __MINGW32__ and __CYGWIN__.
diego
parents: 27461
diff changeset
62 #elif defined(__MINGW32__) || defined(__CYGWIN__)
30629
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
63 #include <ddk/ntddcdrm.h>
30613
e04602bd557a Add missing 'defined' for __bsdi__.
komh
parents: 30426
diff changeset
64 #elif defined(__bsdi__)
30629
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
65 #include <dvd.h>
25393
454ab8a40f1c Support cddb on darwin.
ulion
parents: 23734
diff changeset
66 #elif defined(__APPLE__) || defined(__DARWIN__)
30629
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
67 #include <IOKit/storage/IOCDTypes.h>
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
68 #include <IOKit/storage/IOCDMediaBSDClient.h>
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
69 #include "mpbswap.h"
6474
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
70 #endif
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
71
30746
7092b8fc23f4 Add cddb:// support for OS/2
komh
parents: 30694
diff changeset
72 #include "osdep/osdep.h"
7092b8fc23f4 Add cddb:// support for OS/2
komh
parents: 30694
diff changeset
73
6697
4cade272ce2b Added a simple xmcd parser to retreive the tracks name.
bertrand
parents: 6475
diff changeset
74 #include "cdd.h"
31511
13ca93203358 Factorize MPlayer/MEncoder version string handling.
diego
parents: 31448
diff changeset
75 #include "mpcommon.h"
6474
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
76 #include "stream.h"
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
77 #include "network.h"
25948
e8945e43a36f #include just libavutil/common.h, not all of libavutil/intreadwrite.h.
diego
parents: 25796
diff changeset
78 #include "libavutil/common.h"
6474
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
79
30629
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
80 #define DEFAULT_FREEDB_SERVER "freedb.freedb.org"
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
81 #define DEFAULT_CACHE_DIR "/.cddb/"
6474
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
82
31448
80a4a25c24c5 Move cddb_data_t and cd_toc_t structs to the only place they are used.
diego
parents: 31444
diff changeset
83 typedef struct {
80a4a25c24c5 Move cddb_data_t and cd_toc_t structs to the only place they are used.
diego
parents: 31444
diff changeset
84 char cddb_hello[1024];
80a4a25c24c5 Move cddb_data_t and cd_toc_t structs to the only place they are used.
diego
parents: 31444
diff changeset
85 unsigned long disc_id;
80a4a25c24c5 Move cddb_data_t and cd_toc_t structs to the only place they are used.
diego
parents: 31444
diff changeset
86 unsigned int tracks;
80a4a25c24c5 Move cddb_data_t and cd_toc_t structs to the only place they are used.
diego
parents: 31444
diff changeset
87 char *cache_dir;
80a4a25c24c5 Move cddb_data_t and cd_toc_t structs to the only place they are used.
diego
parents: 31444
diff changeset
88 char *freedb_server;
80a4a25c24c5 Move cddb_data_t and cd_toc_t structs to the only place they are used.
diego
parents: 31444
diff changeset
89 int freedb_proto_level;
80a4a25c24c5 Move cddb_data_t and cd_toc_t structs to the only place they are used.
diego
parents: 31444
diff changeset
90 int anonymous;
80a4a25c24c5 Move cddb_data_t and cd_toc_t structs to the only place they are used.
diego
parents: 31444
diff changeset
91 char category[100];
80a4a25c24c5 Move cddb_data_t and cd_toc_t structs to the only place they are used.
diego
parents: 31444
diff changeset
92 char *xmcd_file;
80a4a25c24c5 Move cddb_data_t and cd_toc_t structs to the only place they are used.
diego
parents: 31444
diff changeset
93 size_t xmcd_file_size;
80a4a25c24c5 Move cddb_data_t and cd_toc_t structs to the only place they are used.
diego
parents: 31444
diff changeset
94 void *user_data;
80a4a25c24c5 Move cddb_data_t and cd_toc_t structs to the only place they are used.
diego
parents: 31444
diff changeset
95 } cddb_data_t;
80a4a25c24c5 Move cddb_data_t and cd_toc_t structs to the only place they are used.
diego
parents: 31444
diff changeset
96
80a4a25c24c5 Move cddb_data_t and cd_toc_t structs to the only place they are used.
diego
parents: 31444
diff changeset
97 typedef struct {
80a4a25c24c5 Move cddb_data_t and cd_toc_t structs to the only place they are used.
diego
parents: 31444
diff changeset
98 unsigned int min, sec, frame;
80a4a25c24c5 Move cddb_data_t and cd_toc_t structs to the only place they are used.
diego
parents: 31444
diff changeset
99 } cd_toc_t;
80a4a25c24c5 Move cddb_data_t and cd_toc_t structs to the only place they are used.
diego
parents: 31444
diff changeset
100
6697
4cade272ce2b Added a simple xmcd parser to retreive the tracks name.
bertrand
parents: 6475
diff changeset
101 static cd_toc_t cdtoc[100];
16524
83d101e1bedb Prints the number of tracks and MSF length for each track of an audio CD,
gpoirier
parents: 15566
diff changeset
102 static int cdtoc_last_track;
6474
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
103
30693
ce392deeb0a6 Make local-only cddb functions static.
reimar
parents: 30685
diff changeset
104 static int read_toc(const char *dev)
30629
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
105 {
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
106 int first = 0, last = -1;
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
107 int i;
27727
48c1ae64255b Replace preprocessor check for WIN32 with checks for __MINGW32__ and __CYGWIN__.
diego
parents: 27461
diff changeset
108 #if defined(__MINGW32__) || defined(__CYGWIN__)
30629
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
109 HANDLE drive;
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
110 DWORD r;
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
111 CDROM_TOC toc;
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
112 char device[10];
20586
d9558d78179d cosmetics: move WIN32 read_toc code to allow for summarizing more common
reimar
parents: 20583
diff changeset
113
35212
fe44546ee423 Replace sprintf with snprintf.
reimar
parents: 33362
diff changeset
114 snprintf(device, sizeof(device), "\\\\.\\%s", dev);
30629
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
115 drive = CreateFile(device, GENERIC_READ, FILE_SHARE_READ, NULL,
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
116 OPEN_EXISTING, 0, 0);
20586
d9558d78179d cosmetics: move WIN32 read_toc code to allow for summarizing more common
reimar
parents: 20583
diff changeset
117
30629
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
118 if (!DeviceIoControl(drive, IOCTL_CDROM_READ_TOC, NULL, 0, &toc,
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
119 sizeof(CDROM_TOC), &r, 0)) {
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
120 mp_msg(MSGT_OPEN, MSGL_ERR, MSGTR_MPDEMUX_CDDB_FailedToReadTOC);
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
121 return 0;
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
122 }
20586
d9558d78179d cosmetics: move WIN32 read_toc code to allow for summarizing more common
reimar
parents: 20583
diff changeset
123
30629
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
124 first = toc.FirstTrack - 1; last = toc.LastTrack;
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
125 for (i = first; i <= last; i++) {
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
126 cdtoc[i].min = toc.TrackData[i].Address[1];
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
127 cdtoc[i].sec = toc.TrackData[i].Address[2];
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
128 cdtoc[i].frame = toc.TrackData[i].Address[3];
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
129 }
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
130 CloseHandle(drive);
20586
d9558d78179d cosmetics: move WIN32 read_toc code to allow for summarizing more common
reimar
parents: 20583
diff changeset
131
30746
7092b8fc23f4 Add cddb:// support for OS/2
komh
parents: 30694
diff changeset
132 #elif defined(__OS2__)
7092b8fc23f4 Add cddb:// support for OS/2
komh
parents: 30694
diff changeset
133 UCHAR auchParamDisk[4] = {'C', 'D', '0', '1'};
7092b8fc23f4 Add cddb:// support for OS/2
komh
parents: 30694
diff changeset
134
7092b8fc23f4 Add cddb:// support for OS/2
komh
parents: 30694
diff changeset
135 struct {
7092b8fc23f4 Add cddb:// support for OS/2
komh
parents: 30694
diff changeset
136 BYTE bFirstTrack;
7092b8fc23f4 Add cddb:// support for OS/2
komh
parents: 30694
diff changeset
137 BYTE bLastTrack;
7092b8fc23f4 Add cddb:// support for OS/2
komh
parents: 30694
diff changeset
138 BYTE bLeadOutF;
7092b8fc23f4 Add cddb:// support for OS/2
komh
parents: 30694
diff changeset
139 BYTE bLeadOutS;
7092b8fc23f4 Add cddb:// support for OS/2
komh
parents: 30694
diff changeset
140 BYTE bLeadOutM;
7092b8fc23f4 Add cddb:// support for OS/2
komh
parents: 30694
diff changeset
141 BYTE bLeadOutReserved;
7092b8fc23f4 Add cddb:// support for OS/2
komh
parents: 30694
diff changeset
142 } __attribute__((packed)) sDataDisk;
7092b8fc23f4 Add cddb:// support for OS/2
komh
parents: 30694
diff changeset
143
7092b8fc23f4 Add cddb:// support for OS/2
komh
parents: 30694
diff changeset
144 struct {
7092b8fc23f4 Add cddb:// support for OS/2
komh
parents: 30694
diff changeset
145 UCHAR auchSign[4];
7092b8fc23f4 Add cddb:// support for OS/2
komh
parents: 30694
diff changeset
146 BYTE bTrack;
7092b8fc23f4 Add cddb:// support for OS/2
komh
parents: 30694
diff changeset
147 } __attribute__((packed)) sParamTrack = {{'C', 'D', '0', '1'},};
7092b8fc23f4 Add cddb:// support for OS/2
komh
parents: 30694
diff changeset
148
7092b8fc23f4 Add cddb:// support for OS/2
komh
parents: 30694
diff changeset
149 struct {
7092b8fc23f4 Add cddb:// support for OS/2
komh
parents: 30694
diff changeset
150 BYTE bStartF;
7092b8fc23f4 Add cddb:// support for OS/2
komh
parents: 30694
diff changeset
151 BYTE bStartS;
7092b8fc23f4 Add cddb:// support for OS/2
komh
parents: 30694
diff changeset
152 BYTE bStartM;
7092b8fc23f4 Add cddb:// support for OS/2
komh
parents: 30694
diff changeset
153 BYTE bStartReserved;
7092b8fc23f4 Add cddb:// support for OS/2
komh
parents: 30694
diff changeset
154 BYTE bControlInfo;
7092b8fc23f4 Add cddb:// support for OS/2
komh
parents: 30694
diff changeset
155 } __attribute__((packed)) sDataTrack;
7092b8fc23f4 Add cddb:// support for OS/2
komh
parents: 30694
diff changeset
156
7092b8fc23f4 Add cddb:// support for OS/2
komh
parents: 30694
diff changeset
157 HFILE hcd;
7092b8fc23f4 Add cddb:// support for OS/2
komh
parents: 30694
diff changeset
158 ULONG ulAction;
7092b8fc23f4 Add cddb:// support for OS/2
komh
parents: 30694
diff changeset
159 ULONG ulParamLen;
7092b8fc23f4 Add cddb:// support for OS/2
komh
parents: 30694
diff changeset
160 ULONG ulDataLen;
7092b8fc23f4 Add cddb:// support for OS/2
komh
parents: 30694
diff changeset
161 ULONG rc;
7092b8fc23f4 Add cddb:// support for OS/2
komh
parents: 30694
diff changeset
162
7092b8fc23f4 Add cddb:// support for OS/2
komh
parents: 30694
diff changeset
163 rc = DosOpen(dev, &hcd, &ulAction, 0, FILE_NORMAL,
7092b8fc23f4 Add cddb:// support for OS/2
komh
parents: 30694
diff changeset
164 OPEN_ACTION_OPEN_IF_EXISTS | OPEN_ACTION_FAIL_IF_NEW,
7092b8fc23f4 Add cddb:// support for OS/2
komh
parents: 30694
diff changeset
165 OPEN_ACCESS_READONLY | OPEN_SHARE_DENYNONE | OPEN_FLAGS_DASD,
7092b8fc23f4 Add cddb:// support for OS/2
komh
parents: 30694
diff changeset
166 NULL);
7092b8fc23f4 Add cddb:// support for OS/2
komh
parents: 30694
diff changeset
167 if (rc) {
7092b8fc23f4 Add cddb:// support for OS/2
komh
parents: 30694
diff changeset
168 mp_msg(MSGT_OPEN, MSGL_ERR, MSGTR_MPDEMUX_CDDB_FailedToReadTOC);
7092b8fc23f4 Add cddb:// support for OS/2
komh
parents: 30694
diff changeset
169 return -1;
7092b8fc23f4 Add cddb:// support for OS/2
komh
parents: 30694
diff changeset
170 }
7092b8fc23f4 Add cddb:// support for OS/2
komh
parents: 30694
diff changeset
171
7092b8fc23f4 Add cddb:// support for OS/2
komh
parents: 30694
diff changeset
172 rc = DosDevIOCtl(hcd, IOCTL_CDROMAUDIO, CDROMAUDIO_GETAUDIODISK,
7092b8fc23f4 Add cddb:// support for OS/2
komh
parents: 30694
diff changeset
173 auchParamDisk, sizeof(auchParamDisk), &ulParamLen,
7092b8fc23f4 Add cddb:// support for OS/2
komh
parents: 30694
diff changeset
174 &sDataDisk, sizeof(sDataDisk), &ulDataLen);
7092b8fc23f4 Add cddb:// support for OS/2
komh
parents: 30694
diff changeset
175 if (!rc) {
7092b8fc23f4 Add cddb:// support for OS/2
komh
parents: 30694
diff changeset
176 first = sDataDisk.bFirstTrack - 1;
7092b8fc23f4 Add cddb:// support for OS/2
komh
parents: 30694
diff changeset
177 last = sDataDisk.bLastTrack;
7092b8fc23f4 Add cddb:// support for OS/2
komh
parents: 30694
diff changeset
178 for (i = first; i <= last; i++) {
7092b8fc23f4 Add cddb:// support for OS/2
komh
parents: 30694
diff changeset
179 if (i == last) {
7092b8fc23f4 Add cddb:// support for OS/2
komh
parents: 30694
diff changeset
180 sDataTrack.bStartM = sDataDisk.bLeadOutM;
7092b8fc23f4 Add cddb:// support for OS/2
komh
parents: 30694
diff changeset
181 sDataTrack.bStartS = sDataDisk.bLeadOutS;
7092b8fc23f4 Add cddb:// support for OS/2
komh
parents: 30694
diff changeset
182 sDataTrack.bStartF = sDataDisk.bLeadOutF;
7092b8fc23f4 Add cddb:// support for OS/2
komh
parents: 30694
diff changeset
183 } else {
7092b8fc23f4 Add cddb:// support for OS/2
komh
parents: 30694
diff changeset
184 sParamTrack.bTrack = i + 1;
7092b8fc23f4 Add cddb:// support for OS/2
komh
parents: 30694
diff changeset
185 rc = DosDevIOCtl(hcd, IOCTL_CDROMAUDIO, CDROMAUDIO_GETAUDIOTRACK,
7092b8fc23f4 Add cddb:// support for OS/2
komh
parents: 30694
diff changeset
186 &sParamTrack, sizeof(sParamTrack), &ulParamLen,
7092b8fc23f4 Add cddb:// support for OS/2
komh
parents: 30694
diff changeset
187 &sDataTrack, sizeof(sDataTrack), &ulDataLen);
7092b8fc23f4 Add cddb:// support for OS/2
komh
parents: 30694
diff changeset
188 if (rc)
7092b8fc23f4 Add cddb:// support for OS/2
komh
parents: 30694
diff changeset
189 break;
7092b8fc23f4 Add cddb:// support for OS/2
komh
parents: 30694
diff changeset
190 }
7092b8fc23f4 Add cddb:// support for OS/2
komh
parents: 30694
diff changeset
191
7092b8fc23f4 Add cddb:// support for OS/2
komh
parents: 30694
diff changeset
192 cdtoc[i].min = sDataTrack.bStartM;
7092b8fc23f4 Add cddb:// support for OS/2
komh
parents: 30694
diff changeset
193 cdtoc[i].sec = sDataTrack.bStartS;
7092b8fc23f4 Add cddb:// support for OS/2
komh
parents: 30694
diff changeset
194 cdtoc[i].frame = sDataTrack.bStartF;
7092b8fc23f4 Add cddb:// support for OS/2
komh
parents: 30694
diff changeset
195 }
7092b8fc23f4 Add cddb:// support for OS/2
komh
parents: 30694
diff changeset
196 }
7092b8fc23f4 Add cddb:// support for OS/2
komh
parents: 30694
diff changeset
197
7092b8fc23f4 Add cddb:// support for OS/2
komh
parents: 30694
diff changeset
198 DosClose(hcd);
7092b8fc23f4 Add cddb:// support for OS/2
komh
parents: 30694
diff changeset
199
7092b8fc23f4 Add cddb:// support for OS/2
komh
parents: 30694
diff changeset
200 if (rc) {
7092b8fc23f4 Add cddb:// support for OS/2
komh
parents: 30694
diff changeset
201 mp_msg(MSGT_OPEN, MSGL_ERR, MSGTR_MPDEMUX_CDDB_FailedToReadTOC);
7092b8fc23f4 Add cddb:// support for OS/2
komh
parents: 30694
diff changeset
202 return -1;
7092b8fc23f4 Add cddb:// support for OS/2
komh
parents: 30694
diff changeset
203 }
20586
d9558d78179d cosmetics: move WIN32 read_toc code to allow for summarizing more common
reimar
parents: 20583
diff changeset
204 #else
30629
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
205 int drive;
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
206 drive = open(dev, O_RDONLY | O_NONBLOCK);
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
207 if (drive < 0) {
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
208 return drive;
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
209 }
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 28402
diff changeset
210
20587
128b2dc39f57 More code shuffling
reimar
parents: 20586
diff changeset
211 #if defined(__linux__) || defined(__bsdi__)
30629
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
212 {
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
213 struct cdrom_tochdr tochdr;
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
214 ioctl(drive, CDROMREADTOCHDR, &tochdr);
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
215 first = tochdr.cdth_trk0 - 1; last = tochdr.cdth_trk1;
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
216 }
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
217 for (i = first; i <= last; i++) {
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
218 struct cdrom_tocentry tocentry;
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
219 tocentry.cdte_track = (i == last) ? 0xAA : i + 1;
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
220 tocentry.cdte_format = CDROM_MSF;
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
221 ioctl(drive, CDROMREADTOCENTRY, &tocentry);
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
222 cdtoc[i].min = tocentry.cdte_addr.msf.minute;
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
223 cdtoc[i].sec = tocentry.cdte_addr.msf.second;
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
224 cdtoc[i].frame = tocentry.cdte_addr.msf.frame;
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
225 }
21848
3ff1eade91f9 GNU/kFreeBSD support, closes Bugzilla #704.
diego
parents: 20587
diff changeset
226 #elif defined(__FreeBSD__) || defined(__FreeBSD_kernel__) || defined(__DragonFly__)
30629
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
227 {
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
228 struct ioc_toc_header tochdr;
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
229 ioctl(drive, CDIOREADTOCHEADER, &tochdr);
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
230 first = tochdr.starting_track - 1; last = tochdr.ending_track;
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
231 }
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
232 for (i = first; i <= last; i++) {
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
233 struct ioc_read_toc_single_entry tocentry;
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
234 tocentry.track = (i == last) ? 0xAA : i + 1;
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
235 tocentry.address_format = CD_MSF_FORMAT;
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
236 ioctl(drive, CDIOREADTOCENTRY, &tocentry);
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
237 cdtoc[i].min = tocentry.entry.addr.msf.minute;
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
238 cdtoc[i].sec = tocentry.entry.addr.msf.second;
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
239 cdtoc[i].frame = tocentry.entry.addr.msf.frame;
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
240 }
8962
c61e70388f6b Removed the hardcoded cdrom device.
bertrand
parents: 8746
diff changeset
241 #elif defined(__NetBSD__) || defined(__OpenBSD__)
30629
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
242 {
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
243 struct ioc_toc_header tochdr;
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
244 ioctl(drive, CDIOREADTOCHEADER, &tochdr);
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
245 first = tochdr.starting_track - 1; last = tochdr.ending_track;
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
246 }
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
247 for (i = first; i <= last; i++) {
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
248 struct ioc_read_toc_entry tocentry;
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
249 struct cd_toc_entry toc_buffer;
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
250 tocentry.starting_track = (i == last) ? 0xAA : i + 1;
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
251 tocentry.address_format = CD_MSF_FORMAT;
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
252 tocentry.data = &toc_buffer;
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
253 tocentry.data_len = sizeof(toc_buffer);
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
254 ioctl(drive, CDIOREADTOCENTRYS, &tocentry);
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
255 cdtoc[i].min = toc_buffer.addr.msf.minute;
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
256 cdtoc[i].sec = toc_buffer.addr.msf.second;
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
257 cdtoc[i].frame = toc_buffer.addr.msf.frame;
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
258 }
25393
454ab8a40f1c Support cddb on darwin.
ulion
parents: 23734
diff changeset
259 #elif defined(__APPLE__) || defined(__DARWIN__)
30629
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
260 {
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
261 dk_cd_read_toc_t tochdr;
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
262 uint8_t buf[4];
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
263 uint8_t buf2[100 * sizeof(CDTOCDescriptor) + sizeof(CDTOC)];
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
264 memset(&tochdr, 0, sizeof(tochdr));
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
265 tochdr.bufferLength = sizeof(buf);
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
266 tochdr.buffer = &buf;
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
267 if (!ioctl(drive, DKIOCCDREADTOC, &tochdr)
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
268 && tochdr.bufferLength == sizeof(buf)) {
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
269 first = buf[2] - 1;
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
270 last = buf[3];
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
271 }
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
272 if (last >= 0) {
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
273 memset(&tochdr, 0, sizeof(tochdr));
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
274 tochdr.bufferLength = sizeof(buf2);
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
275 tochdr.buffer = &buf2;
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
276 tochdr.format = kCDTOCFormatTOC;
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
277 if (ioctl(drive, DKIOCCDREADTOC, &tochdr)
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
278 || tochdr.bufferLength < sizeof(CDTOC))
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
279 last = -1;
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
280 }
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
281 if (last >= 0) {
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
282 CDTOC *cdToc = (CDTOC *)buf2;
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
283 CDTrackInfo lastTrack;
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
284 dk_cd_read_track_info_t trackInfoParams;
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
285 for (i = first; i < last; ++i) {
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
286 CDMSF msf = CDConvertTrackNumberToMSF(i + 1, cdToc);
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
287 cdtoc[i].min = msf.minute;
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
288 cdtoc[i].sec = msf.second;
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
289 cdtoc[i].frame = msf.frame;
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
290 }
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
291 memset(&trackInfoParams, 0, sizeof(trackInfoParams));
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
292 trackInfoParams.addressType = kCDTrackInfoAddressTypeTrackNumber;
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
293 trackInfoParams.bufferLength = sizeof(lastTrack);
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
294 trackInfoParams.address = last;
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
295 trackInfoParams.buffer = &lastTrack;
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
296 if (!ioctl(drive, DKIOCCDREADTRACKINFO, &trackInfoParams)) {
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
297 CDMSF msf = CDConvertLBAToMSF(be2me_32(lastTrack.trackStartAddress)
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
298 + be2me_32(lastTrack.trackSize));
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
299 cdtoc[last].min = msf.minute;
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
300 cdtoc[last].sec = msf.second;
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
301 cdtoc[last].frame = msf.frame;
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
302 }
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
303 }
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
304 }
20587
128b2dc39f57 More code shuffling
reimar
parents: 20586
diff changeset
305 #endif
30629
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
306 close(drive);
20581
bfcc98ad59ba Factor out common code in stream_cddb read_toc function.
reimar
parents: 20579
diff changeset
307 #endif
30629
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
308 for (i = first; i <= last; i++)
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
309 cdtoc[i].frame += (cdtoc[i].min * 60 + cdtoc[i].sec) * 75;
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
310 return last;
7269
a5f1baaf7714 Applied patch for OpenBDS from Marc Espie (submitted by Bj«Órn Sandell <biorn@dce.chalmers.se>)
bertrand
parents: 6697
diff changeset
311 }
6474
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
312
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 28402
diff changeset
313 /**
16524
83d101e1bedb Prints the number of tracks and MSF length for each track of an audio CD,
gpoirier
parents: 15566
diff changeset
314 \brief Reads TOC from CD in the given device and prints the number of tracks
83d101e1bedb Prints the number of tracks and MSF length for each track of an audio CD,
gpoirier
parents: 15566
diff changeset
315 and the length of each track in minute:second:frame format.
83d101e1bedb Prints the number of tracks and MSF length for each track of an audio CD,
gpoirier
parents: 15566
diff changeset
316 \param *dev the device to analyse
83d101e1bedb Prints the number of tracks and MSF length for each track of an audio CD,
gpoirier
parents: 15566
diff changeset
317 \return if the command line -identify is given, returns the last track of
83d101e1bedb Prints the number of tracks and MSF length for each track of an audio CD,
gpoirier
parents: 15566
diff changeset
318 the TOC or -1 if the TOC can't be read,
83d101e1bedb Prints the number of tracks and MSF length for each track of an audio CD,
gpoirier
parents: 15566
diff changeset
319 otherwise just returns 0 and let cddb_resolve the TOC
83d101e1bedb Prints the number of tracks and MSF length for each track of an audio CD,
gpoirier
parents: 15566
diff changeset
320 */
83d101e1bedb Prints the number of tracks and MSF length for each track of an audio CD,
gpoirier
parents: 15566
diff changeset
321 int cdd_identify(const char *dev)
83d101e1bedb Prints the number of tracks and MSF length for each track of an audio CD,
gpoirier
parents: 15566
diff changeset
322 {
30629
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
323 cdtoc_last_track = 0;
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
324 if (mp_msg_test(MSGT_IDENTIFY, MSGL_INFO)) {
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
325 int i, min, sec, frame;
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
326 cdtoc_last_track = read_toc(dev);
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
327 if (cdtoc_last_track < 0) {
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
328 mp_msg(MSGT_OPEN, MSGL_ERR, MSGTR_MPDEMUX_CDDB_FailedToOpenDevice,
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
329 dev);
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
330 return -1;
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
331 }
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
332 mp_msg(MSGT_GLOBAL, MSGL_INFO, "ID_CDDA_TRACKS=%d\n", cdtoc_last_track);
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
333 for (i = 1; i <= cdtoc_last_track; i++) {
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
334 frame = cdtoc[i].frame - cdtoc[i-1].frame;
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
335 sec = frame / 75;
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
336 frame -= sec * 75;
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
337 min = sec / 60;
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
338 sec -= min * 60;
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
339 mp_msg(MSGT_IDENTIFY, MSGL_INFO,
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
340 "ID_CDDA_TRACK_%d_MSF=%02d:%02d:%02d\n", i, min, sec, frame);
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
341 }
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
342 }
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
343 return cdtoc_last_track;
16524
83d101e1bedb Prints the number of tracks and MSF length for each track of an audio CD,
gpoirier
parents: 15566
diff changeset
344 }
83d101e1bedb Prints the number of tracks and MSF length for each track of an audio CD,
gpoirier
parents: 15566
diff changeset
345
30693
ce392deeb0a6 Make local-only cddb functions static.
reimar
parents: 30685
diff changeset
346 static unsigned int cddb_sum(int n)
30629
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
347 {
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
348 unsigned int ret;
6474
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
349
30629
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
350 ret = 0;
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
351 while (n > 0) {
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
352 ret += (n % 10);
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
353 n /= 10;
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
354 }
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
355 return ret;
6474
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
356 }
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
357
30693
ce392deeb0a6 Make local-only cddb functions static.
reimar
parents: 30685
diff changeset
358 static unsigned long cddb_discid(int tot_trks)
30629
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
359 {
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
360 unsigned int i, t = 0, n = 0;
6474
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
361
30629
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
362 i = 0;
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
363 while (i < (unsigned int)tot_trks) {
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
364 n = n + cddb_sum((cdtoc[i].min * 60) + cdtoc[i].sec);
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
365 i++;
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
366 }
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
367 t = ((cdtoc[tot_trks].min * 60) + cdtoc[tot_trks].sec) -
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
368 ((cdtoc[0].min * 60) + cdtoc[0].sec);
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
369 return (n % 0xff) << 24 | t << 8 | tot_trks;
6474
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
370 }
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
371
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
372
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
373
30693
ce392deeb0a6 Make local-only cddb functions static.
reimar
parents: 30685
diff changeset
374 static int cddb_http_request(char *command,
30629
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
375 int (*reply_parser)(HTTP_header_t*, cddb_data_t*),
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
376 cddb_data_t *cddb_data)
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
377 {
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
378 char request[4096];
36559
85b5f38299fb cddb: fix multiple leaks, both for error and normal use cases.
reimar
parents: 35212
diff changeset
379 int fd = -1, ret = -1;
85b5f38299fb cddb: fix multiple leaks, both for error and normal use cases.
reimar
parents: 35212
diff changeset
380 URL_t *url = NULL;
85b5f38299fb cddb: fix multiple leaks, both for error and normal use cases.
reimar
parents: 35212
diff changeset
381 HTTP_header_t *http_hdr = NULL;
6474
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
382
30629
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
383 if (reply_parser == NULL || command == NULL || cddb_data == NULL)
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
384 return -1;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 28402
diff changeset
385
35212
fe44546ee423 Replace sprintf with snprintf.
reimar
parents: 33362
diff changeset
386 snprintf(request, sizeof(request), "http://%s/~cddb/cddb.cgi?cmd=%s%s&proto=%d",
30629
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
387 cddb_data->freedb_server, command, cddb_data->cddb_hello,
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
388 cddb_data->freedb_proto_level);
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
389 mp_msg(MSGT_OPEN, MSGL_INFO,"Request[%s]\n", request);
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
390
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
391 url = url_new(request);
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
392 if (url == NULL) {
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
393 mp_msg(MSGT_DEMUX, MSGL_ERR, MSGTR_MPDEMUX_CDDB_NotAValidURL);
36559
85b5f38299fb cddb: fix multiple leaks, both for error and normal use cases.
reimar
parents: 35212
diff changeset
394 goto out;
30629
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
395 }
6474
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
396
30629
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
397 fd = http_send_request(url,0);
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
398 if (fd < 0) {
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
399 mp_msg(MSGT_DEMUX, MSGL_ERR,
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
400 MSGTR_MPDEMUX_CDDB_FailedToSendHTTPRequest);
36559
85b5f38299fb cddb: fix multiple leaks, both for error and normal use cases.
reimar
parents: 35212
diff changeset
401 goto out;
30629
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
402 }
6474
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
403
30629
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
404 http_hdr = http_read_response(fd);
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
405 if (http_hdr == NULL) {
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
406 mp_msg(MSGT_DEMUX, MSGL_ERR,
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
407 MSGTR_MPDEMUX_CDDB_FailedToReadHTTPResponse);
36559
85b5f38299fb cddb: fix multiple leaks, both for error and normal use cases.
reimar
parents: 35212
diff changeset
408 goto out;
30629
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
409 }
6474
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
410
30629
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
411 http_debug_hdr(http_hdr);
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
412 mp_msg(MSGT_OPEN, MSGL_INFO,"body=[%s]\n", http_hdr->body);
6474
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
413
36559
85b5f38299fb cddb: fix multiple leaks, both for error and normal use cases.
reimar
parents: 35212
diff changeset
414 ret = 0;
30629
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
415 switch (http_hdr->status_code) {
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
416 case 200:
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
417 ret = reply_parser(http_hdr, cddb_data);
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
418 break;
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
419 case 400:
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
420 mp_msg(MSGT_DEMUX, MSGL_ERR, MSGTR_MPDEMUX_CDDB_HTTPErrorNOTFOUND);
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
421 break;
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
422 default:
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
423 mp_msg(MSGT_DEMUX, MSGL_ERR, MSGTR_MPDEMUX_CDDB_HTTPErrorUnknown);
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
424 }
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 28402
diff changeset
425
36559
85b5f38299fb cddb: fix multiple leaks, both for error and normal use cases.
reimar
parents: 35212
diff changeset
426 out:
85b5f38299fb cddb: fix multiple leaks, both for error and normal use cases.
reimar
parents: 35212
diff changeset
427 if (fd >= 0) closesocket(fd);
85b5f38299fb cddb: fix multiple leaks, both for error and normal use cases.
reimar
parents: 35212
diff changeset
428 if (http_hdr) http_free(http_hdr);
85b5f38299fb cddb: fix multiple leaks, both for error and normal use cases.
reimar
parents: 35212
diff changeset
429 if (url) url_free(url);
30629
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
430
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
431 return ret;
6474
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
432 }
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
433
30693
ce392deeb0a6 Make local-only cddb functions static.
reimar
parents: 30685
diff changeset
434 static int cddb_read_cache(cddb_data_t *cddb_data)
30629
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
435 {
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
436 char file_name[100];
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
437 struct stat stats;
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
438 int file_fd, ret;
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
439 size_t file_size;
6474
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
440
30629
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
441 if (cddb_data == NULL || cddb_data->cache_dir == NULL)
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
442 return -1;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 28402
diff changeset
443
35212
fe44546ee423 Replace sprintf with snprintf.
reimar
parents: 33362
diff changeset
444 snprintf(file_name, sizeof(file_name), "%s%08lx", cddb_data->cache_dir, cddb_data->disc_id);
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 28402
diff changeset
445
30685
7e2f58933cc1 Define O_BINARY if it is undefined.
komh
parents: 30629
diff changeset
446 file_fd = open(file_name, O_RDONLY | O_BINARY);
30629
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
447 if (file_fd < 0) {
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
448 mp_msg(MSGT_DEMUX, MSGL_ERR, MSGTR_MPDEMUX_CDDB_NoCacheFound);
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
449 return -1;
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
450 }
6474
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
451
30629
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
452 ret = fstat(file_fd, &stats);
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
453 if (ret < 0) {
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
454 perror("fstat");
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
455 file_size = 4096;
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
456 } else {
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
457 file_size = stats.st_size < UINT_MAX ? stats.st_size : UINT_MAX - 1;
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
458 }
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 28402
diff changeset
459
30629
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
460 cddb_data->xmcd_file = malloc(file_size + 1);
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
461 if (cddb_data->xmcd_file == NULL) {
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
462 mp_msg(MSGT_DEMUX, MSGL_ERR, MSGTR_MemAllocFailed);
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
463 close(file_fd);
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
464 return -1;
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
465 }
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
466 cddb_data->xmcd_file_size = read(file_fd, cddb_data->xmcd_file, file_size);
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
467 if (cddb_data->xmcd_file_size != file_size) {
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
468 mp_msg(MSGT_DEMUX, MSGL_WARN,
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
469 MSGTR_MPDEMUX_CDDB_NotAllXMCDFileHasBeenRead);
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
470 close(file_fd);
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
471 return -1;
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
472 }
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
473 cddb_data->xmcd_file[cddb_data->xmcd_file_size] = 0;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 28402
diff changeset
474
30629
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
475 close(file_fd);
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 28402
diff changeset
476
30629
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
477 return 0;
6474
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
478 }
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
479
30693
ce392deeb0a6 Make local-only cddb functions static.
reimar
parents: 30685
diff changeset
480 static int cddb_write_cache(cddb_data_t *cddb_data)
30629
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
481 {
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
482 // We have the file, save it for cache.
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
483 struct stat file_stat;
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
484 char file_name[100];
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
485 int file_fd, ret;
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
486 int wrote = 0;
6474
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
487
30629
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
488 if (cddb_data == NULL || cddb_data->cache_dir == NULL)
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
489 return -1;
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
490
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
491 // Check if the CDDB cache dir exist
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
492 ret = stat(cddb_data->cache_dir, &file_stat);
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
493 if (ret < 0) {
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
494 // Directory not present, create it.
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
495 ret = mkdir(cddb_data->cache_dir, 0755);
16935
60bd6aeed405 make it optionally possible to compile MPlayer with libcdio instead of libcdparanoia
faust3
parents: 16524
diff changeset
496 #ifdef __MINGW32__
30629
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
497 if (ret < 0 && errno != EEXIST) {
16935
60bd6aeed405 make it optionally possible to compile MPlayer with libcdio instead of libcdparanoia
faust3
parents: 16524
diff changeset
498 #else
30629
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
499 if (ret < 0) {
16935
60bd6aeed405 make it optionally possible to compile MPlayer with libcdio instead of libcdparanoia
faust3
parents: 16524
diff changeset
500 #endif
30629
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
501 perror("mkdir");
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
502 mp_msg(MSGT_DEMUX, MSGL_ERR,
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
503 MSGTR_MPDEMUX_CDDB_FailedToCreateDirectory,
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
504 cddb_data->cache_dir);
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
505 return -1;
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
506 }
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
507 }
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 28402
diff changeset
508
35212
fe44546ee423 Replace sprintf with snprintf.
reimar
parents: 33362
diff changeset
509 snprintf(file_name, sizeof(file_name), "%s%08lx", cddb_data->cache_dir, cddb_data->disc_id);
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 28402
diff changeset
510
30629
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
511 file_fd = creat(file_name, S_IRUSR | S_IWUSR);
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
512 if (file_fd < 0) {
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
513 perror("create");
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
514 return -1;
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
515 }
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 28402
diff changeset
516
30629
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
517 wrote = write(file_fd, cddb_data->xmcd_file, cddb_data->xmcd_file_size);
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
518 if (wrote < 0) {
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
519 perror("write");
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
520 close(file_fd);
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
521 return -1;
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
522 }
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
523 if ((unsigned int) wrote != cddb_data->xmcd_file_size) {
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
524 mp_msg(MSGT_DEMUX, MSGL_WARN, MSGTR_MPDEMUX_CDDB_NotAllXMCDFileHasBeenWritten);
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
525 close(file_fd);
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
526 return -1;
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
527 }
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 28402
diff changeset
528
30629
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
529 close(file_fd);
6474
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
530
30629
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
531 return 0;
6474
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
532 }
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
533
30693
ce392deeb0a6 Make local-only cddb functions static.
reimar
parents: 30685
diff changeset
534 static int cddb_read_parse(HTTP_header_t *http_hdr, cddb_data_t *cddb_data)
30629
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
535 {
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
536 unsigned long disc_id;
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
537 char category[100];
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
538 char *ptr = NULL, *ptr2 = NULL;
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
539 int ret, status;
6474
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
540
30629
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
541 if (http_hdr == NULL || cddb_data == NULL)
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
542 return -1;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 28402
diff changeset
543
30629
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
544 ret = sscanf(http_hdr->body, "%d ", &status);
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
545 if (ret != 1) {
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
546 mp_msg(MSGT_DEMUX, MSGL_ERR, MSGTR_ParseError);
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
547 return -1;
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
548 }
6474
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
549
30629
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
550 switch (status) {
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
551 case 210:
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
552 ret = sscanf(http_hdr->body, "%d %99s %08lx", &status,
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
553 category, &disc_id);
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
554 if (ret != 3) {
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
555 mp_msg(MSGT_DEMUX, MSGL_ERR, MSGTR_ParseError);
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
556 return -1;
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
557 }
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
558 // Check if it's a xmcd database file
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
559 ptr = strstr(http_hdr->body, "# xmcd");
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
560 if (ptr == NULL) {
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
561 mp_msg(MSGT_DEMUX, MSGL_ERR,
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
562 MSGTR_MPDEMUX_CDDB_InvalidXMCDDatabaseReturned);
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
563 return -1;
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
564 }
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
565 ptr = strdup(ptr);
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
566 // Ok found the beginning of the file
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
567 // look for the end
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
568 ptr2 = strstr(ptr, "\n.\r\n");
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
569 if (!ptr2)
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
570 ptr2 = strstr(ptr, "\n.\n");
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
571 if (ptr2) {
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
572 ptr2++;
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
573 } else {
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
574 mp_msg(MSGT_DEMUX, MSGL_FIXME, "Unable to find '.'\n");
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
575 ptr2 = ptr + strlen(ptr); //return -1;
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
576 }
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
577 // Ok found the end
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
578 // do a sanity check
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
579 if (http_hdr->body_size < (unsigned int)(ptr2 - ptr)) {
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
580 mp_msg(MSGT_DEMUX, MSGL_ERR, MSGTR_MPDEMUX_CDDB_UnexpectedFIXME);
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
581 return -1;
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
582 }
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
583 cddb_data->xmcd_file = ptr;
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
584 cddb_data->xmcd_file_size = ptr2 - ptr;
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
585 cddb_data->xmcd_file[cddb_data->xmcd_file_size] = '\0';
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
586 return cddb_write_cache(cddb_data);
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
587 default:
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
588 mp_msg(MSGT_DEMUX, MSGL_FIXME, MSGTR_MPDEMUX_CDDB_UnhandledCode);
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
589 }
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
590 return 0;
6474
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
591 }
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
592
30693
ce392deeb0a6 Make local-only cddb functions static.
reimar
parents: 30685
diff changeset
593 static int cddb_request_titles(cddb_data_t *cddb_data)
30629
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
594 {
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
595 char command[1024];
35212
fe44546ee423 Replace sprintf with snprintf.
reimar
parents: 33362
diff changeset
596 snprintf(command, sizeof(command), "cddb+read+%s+%08lx",
30629
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
597 cddb_data->category, cddb_data->disc_id);
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
598 return cddb_http_request(command, cddb_read_parse, cddb_data);
6474
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
599 }
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
600
30693
ce392deeb0a6 Make local-only cddb functions static.
reimar
parents: 30685
diff changeset
601 static int cddb_parse_matches_list(HTTP_header_t *http_hdr, cddb_data_t *cddb_data)
30629
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
602 {
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
603 char album_title[100];
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
604 char *ptr = NULL;
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
605 int ret;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 28402
diff changeset
606
30629
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
607 ptr = strstr(http_hdr->body, "\n");
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
608 if (ptr == NULL) {
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
609 mp_msg(MSGT_DEMUX, MSGL_ERR, MSGTR_MPDEMUX_CDDB_UnableToFindEOL);
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
610 return -1;
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
611 }
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
612 ptr++;
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
613 // We have a list of exact/inexact matches, so which one do we use?
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
614 // So let's take the first one.
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
615 ret = sscanf(ptr, "%99s %08lx %99s", cddb_data->category,
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
616 &(cddb_data->disc_id), album_title);
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
617 if (ret != 3) {
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
618 mp_msg(MSGT_DEMUX, MSGL_ERR, MSGTR_ParseError);
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
619 return -1;
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
620 }
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
621 ptr = strstr(http_hdr->body, album_title);
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
622 if (ptr != NULL) {
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
623 char *ptr2;
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
624 int len;
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
625 ptr2 = strstr(ptr, "\n");
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
626 if (ptr2 == NULL) {
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
627 len = (http_hdr->body_size)-(ptr-(http_hdr->body));
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
628 } else {
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
629 len = ptr2-ptr+1;
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
630 }
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
631 len = FFMIN(sizeof(album_title) - 1, len);
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
632 strncpy(album_title, ptr, len);
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
633 album_title[len]='\0';
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
634 }
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
635 mp_msg(MSGT_DEMUX, MSGL_STATUS, MSGTR_MPDEMUX_CDDB_ParseOKFoundAlbumTitle,
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
636 album_title);
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
637 return 0;
8746
f1fc23f6203b - If CDDB fail, try CDDA
bertrand
parents: 8609
diff changeset
638 }
f1fc23f6203b - If CDDB fail, try CDDA
bertrand
parents: 8609
diff changeset
639
30693
ce392deeb0a6 Make local-only cddb functions static.
reimar
parents: 30685
diff changeset
640 static int cddb_query_parse(HTTP_header_t *http_hdr, cddb_data_t *cddb_data)
30629
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
641 {
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
642 char album_title[100];
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
643 char *ptr = NULL;
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
644 int ret, status;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 28402
diff changeset
645
30629
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
646 ret = sscanf(http_hdr->body, "%d ", &status);
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
647 if (ret != 1) {
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
648 mp_msg(MSGT_DEMUX, MSGL_ERR, MSGTR_ParseError);
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
649 return -1;
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
650 }
6474
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
651
30629
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
652 switch (status) {
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
653 case 200:
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
654 // Found exact match
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
655 ret = sscanf(http_hdr->body, "%d %99s %08lx %99s", &status,
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
656 cddb_data->category, &(cddb_data->disc_id), album_title);
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
657 if (ret != 4) {
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
658 mp_msg(MSGT_DEMUX, MSGL_ERR, MSGTR_ParseError);
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
659 return -1;
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
660 }
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
661 ptr = strstr(http_hdr->body, album_title);
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
662 if (ptr != NULL) {
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
663 char *ptr2;
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
664 int len;
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
665 ptr2 = strstr(ptr, "\n");
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
666 if (ptr2 == NULL) {
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
667 len = (http_hdr->body_size)-(ptr-(http_hdr->body));
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
668 } else {
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
669 len = ptr2-ptr+1;
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
670 }
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
671 len = FFMIN(sizeof(album_title) - 1, len);
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
672 strncpy(album_title, ptr, len);
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
673 album_title[len]='\0';
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
674 }
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
675 mp_msg(MSGT_DEMUX, MSGL_STATUS,
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
676 MSGTR_MPDEMUX_CDDB_ParseOKFoundAlbumTitle, album_title);
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
677 return cddb_request_titles(cddb_data);
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
678 case 202:
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
679 // No match found
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
680 mp_msg(MSGT_DEMUX, MSGL_WARN, MSGTR_MPDEMUX_CDDB_AlbumNotFound);
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
681 break;
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
682 case 210:
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
683 // Found exact matches, list follows
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
684 cddb_parse_matches_list(http_hdr, cddb_data);
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
685 return cddb_request_titles(cddb_data);
6474
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
686 /*
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
687 body=[210 Found exact matches, list follows (until terminating `.')
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
688 misc c711930d Santana / Supernatural
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
689 rock c711930d Santana / Supernatural
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
690 blues c711930d Santana / Supernatural
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
691 .]
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 28402
diff changeset
692 */
30629
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
693 case 211:
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
694 // Found inexact matches, list follows
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
695 cddb_parse_matches_list(http_hdr, cddb_data);
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
696 return cddb_request_titles(cddb_data);
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
697 case 500:
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
698 mp_msg(MSGT_DEMUX, MSGL_FIXME,
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
699 MSGTR_MPDEMUX_CDDB_ServerReturnsCommandSyntaxErr);
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
700 break;
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
701 default:
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
702 mp_msg(MSGT_DEMUX, MSGL_FIXME, MSGTR_MPDEMUX_CDDB_UnhandledCode);
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
703 }
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
704 return -1;
6474
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
705 }
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
706
30693
ce392deeb0a6 Make local-only cddb functions static.
reimar
parents: 30685
diff changeset
707 static int cddb_proto_level_parse(HTTP_header_t *http_hdr, cddb_data_t *cddb_data)
30629
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
708 {
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
709 int max;
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
710 int ret, status;
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
711 char *ptr;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 28402
diff changeset
712
30629
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
713 ret = sscanf(http_hdr->body, "%d ", &status);
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
714 if (ret != 1) {
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
715 mp_msg(MSGT_DEMUX, MSGL_ERR, MSGTR_ParseError);
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
716 return -1;
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
717 }
6474
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
718
30629
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
719 switch (status) {
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
720 case 210:
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
721 ptr = strstr(http_hdr->body, "max proto:");
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
722 if (ptr == NULL) {
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
723 mp_msg(MSGT_DEMUX, MSGL_ERR, MSGTR_ParseError);
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
724 return -1;
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
725 }
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
726 ret = sscanf(ptr, "max proto: %d", &max);
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
727 if (ret != 1) {
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
728 mp_msg(MSGT_DEMUX, MSGL_ERR, MSGTR_ParseError);
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
729 return -1;
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
730 }
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
731 cddb_data->freedb_proto_level = max;
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
732 return 0;
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
733 default:
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
734 mp_msg(MSGT_DEMUX, MSGL_FIXME, MSGTR_MPDEMUX_CDDB_UnhandledCode);
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
735 }
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
736 return -1;
6474
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
737 }
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
738
30693
ce392deeb0a6 Make local-only cddb functions static.
reimar
parents: 30685
diff changeset
739 static int cddb_get_proto_level(cddb_data_t *cddb_data)
30629
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
740 {
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
741 return cddb_http_request("stat", cddb_proto_level_parse, cddb_data);
6474
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
742 }
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
743
30693
ce392deeb0a6 Make local-only cddb functions static.
reimar
parents: 30685
diff changeset
744 static void cddb_create_hello(cddb_data_t *cddb_data)
30629
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
745 {
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
746 char host_name[51];
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
747 char *user_name;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 28402
diff changeset
748
30629
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
749 if (cddb_data->anonymous) { // Default is anonymous
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
750 /* Note from Eduardo Pérez Ureta <eperez@it.uc3m.es> :
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
751 * We don't send current user/host name in hello to prevent spam.
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
752 * Software that sends this is considered spyware
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
753 * that most people don't like.
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
754 */
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
755 user_name = "anonymous";
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
756 strcpy(host_name, "localhost");
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
757 } else {
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
758 if (gethostname(host_name, 50) < 0) {
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
759 strcpy(host_name, "localhost");
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
760 }
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
761 user_name = getenv("LOGNAME");
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
762 }
35212
fe44546ee423 Replace sprintf with snprintf.
reimar
parents: 33362
diff changeset
763 snprintf(cddb_data->cddb_hello, sizeof(cddb_data->cddb_hello),
fe44546ee423 Replace sprintf with snprintf.
reimar
parents: 33362
diff changeset
764 "&hello=%s+%s+%s",
31511
13ca93203358 Factorize MPlayer/MEncoder version string handling.
diego
parents: 31448
diff changeset
765 user_name, host_name, mplayer_version);
6474
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
766 }
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
767
30693
ce392deeb0a6 Make local-only cddb functions static.
reimar
parents: 30685
diff changeset
768 static int cddb_retrieve(cddb_data_t *cddb_data)
30629
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
769 {
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
770 char offsets[1024], command[1024];
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
771 char *ptr;
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
772 unsigned int i, time_len;
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
773 int ret;
6474
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
774
30629
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
775 ptr = offsets;
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
776 for (i = 0; i < cddb_data->tracks ; i++) {
35212
fe44546ee423 Replace sprintf with snprintf.
reimar
parents: 33362
diff changeset
777 unsigned space = sizeof(offsets) - (ptr - offsets);
fe44546ee423 Replace sprintf with snprintf.
reimar
parents: 33362
diff changeset
778 if (space < 40) break;
fe44546ee423 Replace sprintf with snprintf.
reimar
parents: 33362
diff changeset
779 ptr += snprintf(ptr, space, "%d+", cdtoc[i].frame);
30629
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
780 }
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
781 ptr[0] = 0;
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
782 time_len = (cdtoc[cddb_data->tracks].frame)/75;
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
783
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
784 cddb_data->freedb_server = DEFAULT_FREEDB_SERVER;
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
785 cddb_data->freedb_proto_level = 1;
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
786 cddb_data->xmcd_file = NULL;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 28402
diff changeset
787
30629
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
788 cddb_create_hello(cddb_data);
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
789 if (cddb_get_proto_level(cddb_data) < 0) {
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
790 mp_msg(MSGT_DEMUX, MSGL_ERR,
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
791 MSGTR_MPDEMUX_CDDB_FailedToGetProtocolLevel);
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
792 return -1;
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
793 }
6474
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
794
35212
fe44546ee423 Replace sprintf with snprintf.
reimar
parents: 33362
diff changeset
795 snprintf(command, sizeof(command), "cddb+query+%08lx+%d+%s%d", cddb_data->disc_id,
30629
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
796 cddb_data->tracks, offsets, time_len);
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
797 ret = cddb_http_request(command, cddb_query_parse, cddb_data);
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
798 if (ret < 0)
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
799 return -1;
6474
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
800
32511
b39155e98ac3 Remove some useless NULL pointer checks before invoking free() on the pointer.
diego
parents: 31511
diff changeset
801 free(cddb_data->cache_dir);
30629
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
802 return 0;
6474
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
803 }
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
804
30629
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
805 int cddb_resolve(const char *dev, char **xmcd_file)
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
806 {
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
807 char cddb_cache_dir[] = DEFAULT_CACHE_DIR;
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
808 char *home_dir = NULL;
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
809 cddb_data_t cddb_data;
6474
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
810
30629
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
811 if (cdtoc_last_track <= 0) {
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
812 cdtoc_last_track = read_toc(dev);
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
813 if (cdtoc_last_track < 0) {
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
814 mp_msg(MSGT_OPEN, MSGL_ERR, MSGTR_MPDEMUX_CDDB_FailedToOpenDevice,
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
815 dev);
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
816 return -1;
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
817 }
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
818 }
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
819 cddb_data.tracks = cdtoc_last_track;
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
820 cddb_data.disc_id = cddb_discid(cddb_data.tracks);
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
821 cddb_data.anonymous = 1; // Don't send user info by default
7746
15ce89ba92cf Don't start a CDDB request to the CDDB server if there is no CD in the drive,
bertrand
parents: 7721
diff changeset
822
30629
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
823 mp_msg(MSGT_IDENTIFY, MSGL_INFO, "ID_CDDB_DISCID=%08lx\n",
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
824 cddb_data.disc_id);
27174
ee63b09aedc9 Add disc ID to -identify output.
diego
parents: 26756
diff changeset
825
30629
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
826 // Check if there is a CD in the drive
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
827 // FIXME: That's not really a good way to check
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
828 if (cddb_data.disc_id == 0) {
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
829 mp_msg(MSGT_DEMUX, MSGL_ERR, MSGTR_MPDEMUX_CDDB_NoCDInDrive);
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
830 return -1;
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
831 }
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 28402
diff changeset
832
30629
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
833 home_dir = getenv("HOME");
16935
60bd6aeed405 make it optionally possible to compile MPlayer with libcdio instead of libcdparanoia
faust3
parents: 16524
diff changeset
834 #ifdef __MINGW32__
30629
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
835 if (home_dir == NULL)
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
836 home_dir = getenv("USERPROFILE");
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
837 if (home_dir == NULL)
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
838 home_dir = getenv("HOMEPATH");
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
839 // Last resort, store the cddb cache in the mplayer directory
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
840 if (home_dir == NULL)
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
841 home_dir = (char *)get_path("");
16935
60bd6aeed405 make it optionally possible to compile MPlayer with libcdio instead of libcdparanoia
faust3
parents: 16524
diff changeset
842 #endif
30629
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
843 if (home_dir == NULL) {
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
844 cddb_data.cache_dir = NULL;
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
845 } else {
35212
fe44546ee423 Replace sprintf with snprintf.
reimar
parents: 33362
diff changeset
846 unsigned len = strlen(home_dir) + strlen(cddb_cache_dir) + 1;
fe44546ee423 Replace sprintf with snprintf.
reimar
parents: 33362
diff changeset
847 cddb_data.cache_dir = malloc(len);
30629
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
848 if (cddb_data.cache_dir == NULL) {
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
849 mp_msg(MSGT_DEMUX, MSGL_ERR, MSGTR_MemAllocFailed);
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
850 return -1;
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
851 }
35212
fe44546ee423 Replace sprintf with snprintf.
reimar
parents: 33362
diff changeset
852 snprintf(cddb_data.cache_dir, len, "%s%s", home_dir, cddb_cache_dir);
30629
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
853 }
6474
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
854
30629
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
855 // Check for a cached file
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
856 if (cddb_read_cache(&cddb_data) < 0) {
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
857 // No Cache found
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
858 if (cddb_retrieve(&cddb_data) < 0) {
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
859 return -1;
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
860 }
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
861 }
6697
4cade272ce2b Added a simple xmcd parser to retreive the tracks name.
bertrand
parents: 6475
diff changeset
862
30629
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
863 if (cddb_data.xmcd_file != NULL) {
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
864 // printf("%s\n", cddb_data.xmcd_file);
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
865 *xmcd_file = cddb_data.xmcd_file;
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
866 return 0;
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
867 }
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 28402
diff changeset
868
30629
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
869 return -1;
6697
4cade272ce2b Added a simple xmcd parser to retreive the tracks name.
bertrand
parents: 6475
diff changeset
870 }
4cade272ce2b Added a simple xmcd parser to retreive the tracks name.
bertrand
parents: 6475
diff changeset
871
30629
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
872 /***************
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
873 * xmcd parser *
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
874 ***************/
30693
ce392deeb0a6 Make local-only cddb functions static.
reimar
parents: 30685
diff changeset
875 static char *xmcd_parse_dtitle(cd_info_t *cd_info, char *line)
30629
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
876 {
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
877 char *ptr, *album;
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
878 ptr = strstr(line, "DTITLE=");
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
879 if (ptr != NULL) {
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
880 ptr += 7;
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
881 album = strstr(ptr, "/");
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
882 if (album == NULL)
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
883 return NULL;
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
884 cd_info->album = malloc(strlen(album + 2) + 1);
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
885 if (cd_info->album == NULL) {
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
886 return NULL;
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
887 }
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
888 strcpy(cd_info->album, album + 2);
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
889 album--;
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
890 album[0] = '\0';
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
891 cd_info->artist = malloc(strlen(ptr) + 1);
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
892 if (cd_info->artist == NULL) {
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
893 return NULL;
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
894 }
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
895 strcpy(cd_info->artist, ptr);
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
896 }
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
897 return ptr;
6697
4cade272ce2b Added a simple xmcd parser to retreive the tracks name.
bertrand
parents: 6475
diff changeset
898 }
4cade272ce2b Added a simple xmcd parser to retreive the tracks name.
bertrand
parents: 6475
diff changeset
899
30693
ce392deeb0a6 Make local-only cddb functions static.
reimar
parents: 30685
diff changeset
900 static char *xmcd_parse_dgenre(cd_info_t *cd_info, char *line)
30629
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
901 {
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
902 char *ptr;
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
903 ptr = strstr(line, "DGENRE=");
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
904 if (ptr != NULL) {
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
905 ptr += 7;
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
906 cd_info->genre = malloc(strlen(ptr)+1);
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
907 if (cd_info->genre == NULL) {
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
908 return NULL;
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
909 }
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
910 strcpy(cd_info->genre, ptr);
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
911 }
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
912 return ptr;
6697
4cade272ce2b Added a simple xmcd parser to retreive the tracks name.
bertrand
parents: 6475
diff changeset
913 }
4cade272ce2b Added a simple xmcd parser to retreive the tracks name.
bertrand
parents: 6475
diff changeset
914
30693
ce392deeb0a6 Make local-only cddb functions static.
reimar
parents: 30685
diff changeset
915 static char *xmcd_parse_ttitle(cd_info_t *cd_info, char *line)
30629
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
916 {
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
917 unsigned int track_nb;
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
918 unsigned long sec, off;
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
919 char *ptr;
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
920 ptr = strstr(line, "TTITLE");
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
921 if (ptr != NULL) {
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
922 ptr += 6;
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
923 // Here we point to the track number
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
924 track_nb = atoi(ptr);
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
925 ptr = strstr(ptr, "=");
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
926 if (ptr == NULL)
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
927 return NULL;
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
928 ptr++;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 28402
diff changeset
929
30629
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
930 sec = cdtoc[track_nb].frame;
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
931 off = cdtoc[track_nb + 1].frame - sec + 1;
6697
4cade272ce2b Added a simple xmcd parser to retreive the tracks name.
bertrand
parents: 6475
diff changeset
932
30629
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
933 cd_info_add_track(cd_info, ptr, track_nb + 1,
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
934 (unsigned int) (off / (60 * 75)),
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
935 (unsigned int) ((off / 75) % 60),
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
936 (unsigned int) (off % 75),
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
937 sec, off);
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
938 }
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
939 return ptr;
6697
4cade272ce2b Added a simple xmcd parser to retreive the tracks name.
bertrand
parents: 6475
diff changeset
940 }
4cade272ce2b Added a simple xmcd parser to retreive the tracks name.
bertrand
parents: 6475
diff changeset
941
30629
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
942 cd_info_t *cddb_parse_xmcd(char *xmcd_file)
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
943 {
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
944 cd_info_t *cd_info = NULL;
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
945 int length, pos = 0;
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
946 char *ptr, *ptr2;
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
947 unsigned int audiolen;
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
948 if (xmcd_file == NULL)
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
949 return NULL;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 28402
diff changeset
950
30629
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
951 cd_info = cd_info_new();
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
952 if (cd_info == NULL) {
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
953 return NULL;
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
954 }
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 28402
diff changeset
955
30629
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
956 length = strlen(xmcd_file);
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
957 ptr = xmcd_file;
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
958 while (ptr != NULL && pos < length) {
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
959 // Read a line
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
960 ptr2 = ptr;
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
961 while(ptr2[0] != '\0' && ptr2[0] != '\r' && ptr2[0] != '\n')
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
962 ptr2++;
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
963 if (ptr2[0] == '\0') {
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
964 break;
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
965 }
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
966 ptr2[0] = '\0';
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
967 // Ignore comments
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
968 if (ptr[0] != '#') {
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
969 // Search for the album title
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
970 if (xmcd_parse_dtitle(cd_info, ptr))
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
971 ;
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
972 // Search for the genre
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
973 else if (xmcd_parse_dgenre(cd_info, ptr))
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
974 ;
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
975 // Search for a track title
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
976 else if (xmcd_parse_ttitle(cd_info, ptr))
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
977 audiolen++; // <-- audiolen++ to shut up gcc warning
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
978 }
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
979 if (ptr2[1] == '\n')
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
980 ptr2++;
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
981 pos = (ptr2 + 1) - ptr;
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
982 ptr = ptr2 + 1;
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
983 }
6697
4cade272ce2b Added a simple xmcd parser to retreive the tracks name.
bertrand
parents: 6475
diff changeset
984
30629
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
985 audiolen = cdtoc[cd_info->nb_tracks].frame-cdtoc[0].frame;
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
986 cd_info->min = (unsigned int) (audiolen / (60 * 75));
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
987 cd_info->sec = (unsigned int) ((audiolen / 75) % 60);
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
988 cd_info->msec = (unsigned int) (audiolen % 75);
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 28402
diff changeset
989
30629
16d7ef2f04e5 cosmetics: K&R coding style, indent with 4 spaces, no tabs
diego
parents: 30613
diff changeset
990 return cd_info;
6474
654b26c941e5 CDDB support added.
bertrand
parents:
diff changeset
991 }