annotate Input/cdaudio/cdaudio.c @ 38:4e0397865a31 trunk

[svn] Regenerate a bunch of stuff :)
author nenolod
date Wed, 26 Oct 2005 10:57:27 -0700
parents cb178e5ad177
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1 /* XMMS - Cross-platform multimedia player
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
2 * Copyright (C) 1998-2003 Peter Alm, Mikael Alm, Olle Hallnas,
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
3 * Thomas Nilsson and 4Front Technologies
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
4 * Copyright (C) 1999-2003 Haavard Kvaalen <havardk@xmms.org>
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
5 *
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
6 * This program is free software; you can redistribute it and/or modify
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
7 * it under the terms of the GNU General Public License as published by
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
8 * the Free Software Foundation; either version 2 of the License, or
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
9 * (at your option) any later version.
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
10 *
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
11 * This program is distributed in the hope that it will be useful,
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
14 * GNU General Public License for more details.
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
15 *
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
16 * You should have received a copy of the GNU General Public License
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
17 * along with this program; if not, write to the Free Software
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
18 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
19 */
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
20
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
21 #ifdef HAVE_CONFIG_H
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
22 # include "config.h"
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
23 #endif
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
24
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
25 #include "cdaudio.h"
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
26
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
27 #include <glib.h>
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
28 #include <glib/gi18n.h>
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
29 #include <glib/gprintf.h>
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
30 #include <string.h>
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
31
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
32 #include <unistd.h>
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
33 #include <errno.h>
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
34 #include <fcntl.h>
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
35 #include <sys/ioctl.h>
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
36 #include <sys/stat.h>
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
37
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
38 #include <libaudacious/configdb.h>
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
39 #include <libaudacious/util.h>
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
40 #include <libaudacious/titlestring.h>
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
41 #include "audacious/output.h"
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
42
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
43 #ifdef CDROMSTOP
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
44 # define XMMS_STOP CDROMSTOP
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
45 #elif defined CDIOCSTOP
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
46 # define XMMS_STOP CDIOCSTOP
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
47 #else
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
48 # error "No stop ioctl"
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
49 #endif
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
50
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
51 #ifdef CDIOCPAUSE
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
52 # define XMMS_PAUSE CDIOCPAUSE
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
53 #elif defined CDROMPAUSE
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
54 # define XMMS_PAUSE CDROMPAUSE
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
55 #else
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
56 # error "No pause ioctl"
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
57 #endif
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
58
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
59 #ifdef CDIOCRESUME
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
60 # define XMMS_RESUME CDIOCRESUME
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
61 #elif defined CDROMRESUME
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
62 # define XMMS_RESUME CDROMRESUME
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
63 #else
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
64 # error "No resume ioctl"
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
65 #endif
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
66
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
67 /*
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
68 * Distributions should not patch this, but instead use the
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
69 * --with-cdda-device=path and --with-cdda-dir=path configure options.
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
70 */
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
71
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
72 #ifndef CDDA_DEVICE
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
73 # ifdef HAVE_SYS_CDIO_H
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
74 # ifdef __FreeBSD__
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
75 # define CDDA_DEVICE "/dev/acd0c"
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
76 # elif defined __OpenBSD__
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
77 # define CDDA_DEVICE "/dev/cd0c"
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
78 # else
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
79 # define CDDA_DEVICE "/vol/dev/aliases/cdrom0"
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
80 # endif
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
81 # else
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
82 # define CDDA_DEVICE "/dev/cdrom"
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
83 # endif
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
84 #endif
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
85
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
86 #ifndef CDDA_DIRECTORY
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
87 # ifdef HAVE_SYS_CDIO_H
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
88 # ifdef __FreeBSD__
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
89 # define CDDA_DIRECTORY "/cdrom"
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
90 # elif defined __OpenBSD__
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
91 # define CDDA_DIRECTORY "/cdrom"
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
92 # else
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
93 # define CDDA_DIRECTORY "/cdrom/cdrom0"
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
94 # endif
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
95 # else
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
96 # define CDDA_DIRECTORY "/mnt/cdrom"
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
97 # endif
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
98 #endif
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
99
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
100
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
101
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
102
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
103 static char *cdda_get_title(cdda_disc_toc_t * toc, int track);
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
104 static gboolean stop_timeout(gpointer data);
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
105
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
106 static void cdda_init(void);
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
107 static int is_our_file(char *filename);
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
108 static GList *scan_dir(char *dir);
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
109 static void play_file(char *filename);
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
110 static void stop(void);
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
111 static void cdda_pause(short p);
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
112 static void seek(int time);
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
113 static int get_time(void);
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
114 static void get_song_info(char *filename, char **title, int *length);
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
115 static void get_volume(int *l, int *r);
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
116 static void set_volume(int l, int r);
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
117 static void cleanup(void);
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
118 void cdda_fileinfo(char *filename);
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
119
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
120 InputPlugin cdda_ip = {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
121 NULL,
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
122 NULL,
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
123 NULL, /* Description */
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
124 cdda_init,
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
125 NULL, /* about */
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
126 cdda_configure,
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
127 is_our_file,
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
128 scan_dir,
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
129 play_file,
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
130 stop,
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
131 cdda_pause,
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
132 seek,
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
133 NULL, /* set_eq */
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
134 get_time,
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
135 get_volume,
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
136 set_volume,
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
137 cleanup,
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
138 NULL, /* obsolete */
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
139 NULL, /* add_vis_pcm */
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
140 NULL, /* set_info, filled in by xmms */
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
141 NULL, /* set_info_text, filled in by xmms */
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
142 get_song_info,
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
143 NULL, /* cdda_fileinfo, *//* file_info_box */
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
144 NULL /* output plugin handle */
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
145 };
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
146
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
147 CDDAConfig cdda_cfg;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
148
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
149 static struct {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
150 struct driveinfo drive;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
151 cdda_disc_toc_t cd_toc;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
152 int track;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
153 int fd;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
154 gboolean playing;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
155 } cdda_playing;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
156
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
157 static struct {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
158 GThread *thread;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
159 gboolean audio_error, eof;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
160 int seek;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
161
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
162 } dae_data;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
163
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
164 static gboolean is_paused;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
165 static int pause_time;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
166
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
167 struct timeout {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
168 int id;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
169 char *device;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
170 };
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
171
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
172 static GList *timeout_list;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
173
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
174 /* Time to delay stop command in 1/10 second */
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
175 #define STOP_DELAY 20
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
176
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
177 InputPlugin *
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
178 get_iplugin_info(void)
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
179 {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
180 cdda_ip.description = g_strdup_printf(_("CD Audio Plugin"));
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
181 return &cdda_ip;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
182 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
183
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
184
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
185
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
186 #ifdef BEEP_CDROM_SOLARIS
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
187 /*
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
188 * Lowlevel cdrom access, Solaris style (Solaris, Linux)
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
189 */
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
190
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
191 static void
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
192 play_ioctl(struct cdda_msf *start, struct cdda_msf *end)
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
193 {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
194 struct cdrom_msf msf;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
195
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
196 msf.cdmsf_min0 = start->minute;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
197 msf.cdmsf_sec0 = start->second;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
198 msf.cdmsf_frame0 = start->frame;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
199 msf.cdmsf_min1 = end->minute;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
200 msf.cdmsf_sec1 = end->second;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
201 msf.cdmsf_frame1 = end->frame;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
202 ioctl(cdda_playing.fd, CDROMPLAYMSF, &msf);
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
203 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
204
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
205 static int
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
206 get_current_frame(void)
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
207 {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
208 struct cdrom_subchnl subchnl;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
209
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
210 subchnl.cdsc_format = CDROM_MSF;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
211 if (ioctl(cdda_playing.fd, CDROMSUBCHNL, &subchnl) < 0)
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
212 return -1;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
213
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
214 switch (subchnl.cdsc_audiostatus) {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
215 case CDROM_AUDIO_COMPLETED:
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
216 case CDROM_AUDIO_ERROR:
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
217 return -1;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
218 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
219
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
220 return (LBA(subchnl.cdsc_absaddr.msf));
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
221 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
222
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
223 #if !defined(CDROMVOLREAD)
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
224 static int volume_left = 100, volume_right = 100;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
225 #endif
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
226
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
227 static void
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
228 drive_get_volume(int *l, int *r)
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
229 {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
230 #if defined(CDROMVOLREAD)
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
231 struct cdrom_volctrl vol;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
232
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
233 if (cdda_playing.fd != -1 && !ioctl(cdda_playing.fd, CDROMVOLREAD, &vol)) {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
234 *l = (100 * vol.channel0) / 255;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
235 *r = (100 * vol.channel1) / 255;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
236 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
237 #if 0
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
238 else if (cdda_playing.fd != -1)
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
239 g_message("CDROMVOLREAD failed");
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
240 #endif
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
241 #else
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
242 *l = volume_left;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
243 *r = volume_right;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
244 #endif
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
245 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
246
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
247 static void
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
248 drive_set_volume(int l, int r)
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
249 {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
250 struct cdrom_volctrl vol;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
251
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
252 if (cdda_playing.fd != -1) {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
253 vol.channel0 = vol.channel2 = (l * 255) / 100;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
254 vol.channel1 = vol.channel3 = (r * 255) / 100;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
255 ioctl(cdda_playing.fd, CDROMVOLCTRL, &vol);
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
256 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
257 #if !defined(CDROMVOLREAD)
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
258 volume_left = l;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
259 volume_right = r;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
260 #endif
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
261 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
262
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
263 #ifdef CDROMREADAUDIO
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
264 int
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
265 read_audio_data(int fd, int pos, int num, void *buf)
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
266 {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
267 struct cdrom_read_audio cdra;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
268
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
269 #if 1
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
270 cdra.addr.lba = pos - CDDA_MSF_OFFSET;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
271 cdra.addr_format = CDROM_LBA;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
272 #else
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
273 cdra.addr.msf.minute = pos / (60 * 75);
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
274 cdra.addr.msf.second = (pos / 75) % 60;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
275 cdra.addr.msf.frame = pos % 75;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
276 cdra.addr_format = CDROM_MSF;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
277 #endif
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
278
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
279 cdra.nframes = num;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
280 cdra.buf = buf;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
281
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
282 if (ioctl(fd, CDROMREADAUDIO, &cdra) < 0)
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
283 return -errno;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
284
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
285 return cdra.nframes;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
286 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
287 #endif /* CDROMREADAUDIO */
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
288
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
289 #if defined(CDROMCDDA)
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
290 int
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
291 read_audio_data(int fd, int pos, int num, void *buf)
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
292 {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
293 struct cdrom_cdda cdra;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
294
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
295 cdra.cdda_addr = pos - CDDA_MSF_OFFSET;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
296 cdra.cdda_length = num;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
297 cdra.cdda_data = buf;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
298 cdra.cdda_subcode = CDROM_DA_NO_SUBCODE;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
299 if (ioctl(fd, CDROMCDDA, &cdra) < 0)
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
300 return -errno;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
301
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
302 return cdra.cdda_length;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
303 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
304 #endif
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
305
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
306 static gboolean
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
307 cdda_get_toc_lowlevel(int fd, cdda_disc_toc_t * info)
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
308 {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
309 struct cdrom_tochdr tochdr;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
310 struct cdrom_tocentry tocentry;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
311 int i;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
312
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
313
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
314
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
315 if (ioctl(fd, CDROMREADTOCHDR, &tochdr))
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
316 return FALSE;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
317
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
318 for (i = tochdr.cdth_trk0; i <= tochdr.cdth_trk1; i++) {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
319 tocentry.cdte_format = CDROM_MSF;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
320 tocentry.cdte_track = i;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
321 if (ioctl(fd, CDROMREADTOCENTRY, &tocentry))
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
322 return FALSE;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
323 info->track[i].minute = tocentry.cdte_addr.msf.minute;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
324 info->track[i].second = tocentry.cdte_addr.msf.second;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
325 info->track[i].frame = tocentry.cdte_addr.msf.frame;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
326 info->track[i].flags.data_track =
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
327 tocentry.cdte_ctrl == CDROM_DATA_TRACK;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
328
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
329 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
330
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
331 /* Get the leadout track */
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
332 tocentry.cdte_track = CDROM_LEADOUT;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
333 tocentry.cdte_format = CDROM_MSF;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
334
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
335 if (ioctl(fd, CDROMREADTOCENTRY, &tocentry))
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
336 return FALSE;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
337 info->leadout.minute = tocentry.cdte_addr.msf.minute;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
338 info->leadout.second = tocentry.cdte_addr.msf.second;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
339 info->leadout.frame = tocentry.cdte_addr.msf.frame;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
340
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
341 info->first_track = tochdr.cdth_trk0;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
342 info->last_track = tochdr.cdth_trk1;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
343
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
344 return TRUE;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
345 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
346
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
347 #endif
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
348
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
349 #ifdef BEEP_CDROM_BSD
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
350 /*
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
351 * Lowlevel cdrom access, BSD style (FreeBSD, OpenBSD, NetBSD, Darwin)
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
352 */
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
353
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
354 static void
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
355 play_ioctl(struct cdda_msf *start, struct cdda_msf *end)
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
356 {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
357 struct ioc_play_msf msf;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
358
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
359 msf.start_m = start->minute;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
360 msf.start_s = start->second;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
361 msf.start_f = start->frame;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
362 msf.end_m = end->minute;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
363 msf.end_s = end->second;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
364 msf.end_f = end->frame;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
365 ioctl(cdda_playing.fd, CDIOCPLAYMSF, &msf);
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
366 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
367
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
368 static int
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
369 get_current_frame(void)
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
370 {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
371 struct ioc_read_subchannel subchnl;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
372 struct cd_sub_channel_info subinfo;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
373 subchnl.address_format = CD_MSF_FORMAT;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
374 subchnl.data_format = CD_CURRENT_POSITION;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
375 subchnl.track = 0;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
376 subchnl.data_len = sizeof(subinfo);
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
377 subchnl.data = &subinfo;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
378 if (ioctl(cdda_playing.fd, CDIOCREADSUBCHANNEL, &subchnl) < 0)
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
379 return -1;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
380
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
381 #ifdef BEEP_CDROM_BSD_DARWIN
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
382 return ((subchnl.data->what.position.absaddr[1] * 60
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
383 subchnl.data->what.position.absaddr[2]) * 75 +
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
384 subchnl.data->what.position.absaddr[3]);
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
385 #else
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
386 return (LBA(subchnl.data->what.position.absaddr.msf));
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
387 #endif
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
388 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
389
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
390 static void
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
391 drive_get_volume(int *l, int *r)
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
392 {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
393 struct ioc_vol vol;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
394
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
395 if (cdda_playing.fd != -1) {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
396 ioctl(cdda_playing.fd, CDIOCGETVOL, &vol);
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
397 *l = (100 * vol.vol[0]) / 255;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
398 *r = (100 * vol.vol[1]) / 255;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
399 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
400 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
401
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
402 static void
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
403 drive_set_volume(int l, int r)
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
404 {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
405 struct ioc_vol vol;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
406
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
407 if (cdda_playing.fd != -1) {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
408 vol.vol[0] = vol.vol[2] = (l * 255) / 100;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
409 vol.vol[1] = vol.vol[3] = (r * 255) / 100;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
410 ioctl(cdda_playing.fd, CDIOCSETVOL, &vol);
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
411 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
412 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
413
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
414
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
415 #if defined(CDIOCREADAUDIO)
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
416 #ifdef __FreeBSD__
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
417 int
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
418 read_audio_data(int fd, int pos, int num, void *buf)
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
419 {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
420 struct ioc_read_audio cdra;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
421
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
422 cdra.address.lba = pos - CDDA_MSF_OFFSET;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
423 cdra.address_format = CD_LBA_FORMAT;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
424 cdra.nframes = num;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
425 cdra.buffer = buf;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
426
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
427 if (ioctl(fd, CDIOCREADAUDIO, &cdra) < 0)
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
428 return -errno;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
429
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
430 return cdra.nframes;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
431 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
432 #else
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
433 #error Please test on other <sys/cdio.h> platforms.
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
434 #endif
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
435 #endif /* CDIOCREADAUDIO */
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
436
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
437 #ifdef BEEP_CDROM_BSD_NETBSD /* NetBSD, OpenBSD */
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
438
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
439 static gboolean
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
440 cdda_get_toc_lowlevel(int fd, cdda_disc_toc_t * info)
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
441 {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
442 struct ioc_toc_header tochdr;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
443 struct ioc_read_toc_entry tocentry;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
444 struct cd_toc_entry tocentrydata;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
445 int i;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
446
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
447 if (ioctl(fd, CDIOREADTOCHEADER, &tochdr))
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
448 return FALSE;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
449
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
450 for (i = tochdr.starting_track; i <= tochdr.ending_track; i++) {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
451 tocentry.address_format = CD_MSF_FORMAT;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
452
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
453 tocentry.starting_track = i;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
454 tocentry.data = &tocentrydata;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
455 tocentry.data_len = sizeof(tocentrydata);
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
456 if (ioctl(fd, CDIOREADTOCENTRYS, &tocentry))
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
457 return FALSE;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
458 info->track[i].minute = tocentry.data->addr.msf.minute;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
459 info->track[i].second = tocentry.data->addr.msf.second;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
460 info->track[i].frame = tocentry.data->addr.msf.frame;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
461 info->track[i].flags.data_track = (tocentry.data->control & 4) == 4;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
462 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
463
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
464 /* Get the leadout track */
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
465 tocentry.address_format = CD_MSF_FORMAT;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
466
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
467 tocentry.starting_track = 0xAA;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
468 tocentry.data = &tocentrydata;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
469 tocentry.data_len = sizeof(tocentrydata);
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
470 if (ioctl(fd, CDIOREADTOCENTRYS, &tocentry))
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
471 return FALSE;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
472 info->leadout.minute = tocentry.data->addr.msf.minute;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
473 info->leadout.second = tocentry.data->addr.msf.second;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
474 info->leadout.frame = tocentry.data->addr.msf.frame;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
475
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
476 info->first_track = tochdr.starting_track;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
477 info->last_track = tochdr.ending_track;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
478
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
479 return TRUE;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
480 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
481
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
482 #elif defined(BEEP_CDROM_BSD_DARWIN)
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
483
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
484 static gboolean
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
485 cdda_get_toc_lowlevel(int fd, cdda_disc_toc_t * info)
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
486 {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
487 struct ioc_toc_header tochdr;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
488 struct ioc_read_toc_entry tocentry;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
489 int i;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
490
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
491 if (ioctl(fd, CDIOREADTOCHEADER, &tochdr))
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
492 return FALSE;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
493
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
494 for (i = tochdr.starting_track; i <= tochdr.ending_track; i++) {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
495 tocentry.address_format = CD_MSF_FORMAT;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
496
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
497 tocentry.starting_track = i;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
498 if (ioctl(fd, CDIOREADTOCENTRYS, &tocentry))
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
499 return FALSE;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
500 info->track[i].minute = tocentry.data->addr[1];
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
501 info->track[i].second = tocentry.data->addr[2];
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
502 info->track[i].frame = tocentry.data->addr[3];
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
503 info->track[i].flags.data_track = (tocentry.data->control & 4) == 4;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
504 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
505
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
506 /* Get the leadout track */
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
507 tocentry.address_format = CD_MSF_FORMAT;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
508
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
509 tocentry.starting_track = 0xAA;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
510 if (ioctl(fd, CDIOREADTOCENTRYS, &tocentry))
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
511 return FALSE;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
512 info->leadout.minute = tocentry.data->addr[1];
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
513 info->leadout.second = tocentry.data->addr[2];
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
514 info->leadout.frame = tocentry.data->addr[3];
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
515
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
516 return TRUE;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
517 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
518
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
519 #else /* FreeBSD */
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
520
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
521 static gboolean
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
522 cdda_get_toc_lowlevel(int fd, cdda_disc_toc_t * info)
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
523 {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
524 struct ioc_toc_header tochdr;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
525 struct ioc_read_toc_single_entry tocentry;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
526 int i;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
527
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
528 if (ioctl(fd, CDIOREADTOCHEADER, &tochdr))
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
529 return FALSE;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
530
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
531 for (i = tochdr.starting_track; i <= tochdr.ending_track; i++) {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
532 tocentry.address_format = CD_MSF_FORMAT;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
533
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
534 tocentry.track = i;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
535 if (ioctl(fd, CDIOREADTOCENTRY, &tocentry))
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
536 return FALSE;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
537 info->track[i].minute = tocentry.entry.addr.msf.minute;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
538 info->track[i].second = tocentry.entry.addr.msf.second;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
539 info->track[i].frame = tocentry.entry.addr.msf.frame;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
540 info->track[i].flags.data_track = (tocentry.entry.control & 4) == 4;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
541 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
542
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
543 /* Get the leadout track */
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
544 tocentry.address_format = CD_MSF_FORMAT;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
545
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
546 tocentry.track = 0xAA;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
547 if (ioctl(fd, CDIOREADTOCENTRY, &tocentry))
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
548 return FALSE;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
549 info->leadout.minute = tocentry.entry.addr.msf.minute;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
550 info->leadout.second = tocentry.entry.addr.msf.second;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
551 info->leadout.frame = tocentry.entry.addr.msf.frame;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
552
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
553 info->first_track = tochdr.starting_track;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
554 info->last_track = tochdr.ending_track;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
555
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
556 return TRUE;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
557 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
558 #endif
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
559
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
560 #endif
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
561
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
562
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
563
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
564
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
565
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
566
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
567
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
568
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
569
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
570
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
571
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
572 extern gboolean
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
573 is_mounted(const char *device_name)
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
574 {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
575 #if defined(HAVE_MNTENT_H) || defined(HAVE_GETMNTINFO)
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
576 char devname[256];
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
577 struct stat st;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
578 #if defined(HAVE_MNTENT_H)
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
579 FILE *mounts;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
580 struct mntent *mnt;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
581 #elif defined(HAVE_GETMNTINFO)
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
582 struct statfs *fsp;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
583 int entries;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
584 #endif
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
585
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
586 if (lstat(device_name, &st) < 0)
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
587 return -1;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
588
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
589 if (S_ISLNK(st.st_mode))
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
590 readlink(device_name, devname, 256);
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
591 else
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
592 strncpy(devname, device_name, 256);
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
593
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
594 #if defined(HAVE_MNTENT_H)
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
595 if ((mounts = setmntent(MOUNTED, "r")) == NULL)
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
596 return TRUE;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
597
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
598 while ((mnt = getmntent(mounts)) != NULL) {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
599 if (strcmp(mnt->mnt_fsname, devname) == 0) {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
600 endmntent(mounts);
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
601 return TRUE;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
602 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
603 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
604 endmntent(mounts);
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
605 #elif defined(HAVE_GETMNTINFO)
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
606 entries = getmntinfo(&fsp, MNT_NOWAIT);
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
607 if (entries < 0)
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
608 return NULL;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
609
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
610 while (entries-- > 0) {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
611 if (!strcmp(fsp->f_mntfromname, devname))
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
612 return TRUE;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
613 fsp++;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
614 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
615 #endif
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
616 #endif
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
617 return FALSE;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
618 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
619
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
620
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
621 gboolean
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
622 cdda_get_toc(cdda_disc_toc_t * info, const char *device)
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
623 {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
624 gboolean retv = FALSE;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
625 int fd;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
626
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
627 if (is_mounted(device))
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
628 return FALSE;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
629
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
630 if ((fd = open(device, CDOPENFLAGS)) == -1)
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
631 return FALSE;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
632
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
633 memset(info, 0, sizeof(cdda_disc_toc_t));
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
634
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
635 retv = cdda_get_toc_lowlevel(fd, info);
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
636 close(fd);
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
637
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
638 return retv;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
639 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
640
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
641 static void
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
642 cdda_init(void)
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
643 {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
644 ConfigDb *db;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
645 struct driveinfo *drive = g_malloc0(sizeof(struct driveinfo));
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
646 int ndrives = 1, i;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
647
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
648 cdda_playing.fd = -1;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
649 memset(&cdda_cfg, 0, sizeof(CDDAConfig));
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
650
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
651 #ifdef HAVE_OSS
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
652 drive->mixer = CDDA_MIXER_OSS;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
653 drive->oss_mixer = SOUND_MIXER_CD;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
654 #endif
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
655
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
656 db = bmp_cfg_db_open();
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
657
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
658 /* These names are used for backwards compatibility */
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
659 bmp_cfg_db_get_string(db, "CDDA", "device", &drive->device);
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
660 bmp_cfg_db_get_string(db, "CDDA", "directory", &drive->directory);
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
661 bmp_cfg_db_get_int(db, "CDDA", "mixer", &drive->mixer);
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
662 bmp_cfg_db_get_int(db, "CDDA", "readmode", &drive->dae);
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
663
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
664 if (!drive->device)
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
665 drive->device = g_strdup(CDDA_DEVICE);
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
666 if (!drive->directory)
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
667 drive->directory = g_strdup(CDDA_DIRECTORY);
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
668
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
669 cdda_cfg.drives = g_list_append(cdda_cfg.drives, drive);
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
670
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
671 bmp_cfg_db_get_int(db, "CDDA", "num_drives", &ndrives);
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
672 for (i = 1; i < ndrives; i++) {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
673 char label[20];
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
674 drive = g_malloc0(sizeof(struct driveinfo));
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
675
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
676 sprintf(label, "device%d", i);
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
677 bmp_cfg_db_get_string(db, "CDDA", label, &drive->device);
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
678
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
679 sprintf(label, "directory%d", i);
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
680 bmp_cfg_db_get_string(db, "CDDA", label, &drive->directory);
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
681
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
682 sprintf(label, "mixer%d", i);
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
683 bmp_cfg_db_get_int(db, "CDDA", label, &drive->mixer);
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
684
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
685 sprintf(label, "readmode%d", i);
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
686 bmp_cfg_db_get_int(db, "CDDA", label, &drive->dae);
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
687
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
688 cdda_cfg.drives = g_list_append(cdda_cfg.drives, drive);
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
689 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
690 bmp_cfg_db_get_bool(db, "CDDA", "title_override",
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
691 &cdda_cfg.title_override);
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
692 bmp_cfg_db_get_string(db, "CDDA", "name_format", &cdda_cfg.name_format);
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
693 bmp_cfg_db_get_bool(db, "CDDA", "use_cddb", &cdda_cfg.use_cddb);
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
694 bmp_cfg_db_get_string(db, "CDDA", "cddb_server", &cdda_cfg.cddb_server);
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
695 #ifdef WITH_CDINDEX
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
696 bmp_cfg_db_get_bool(db, "CDDA", "use_cdin", &cdda_cfg.use_cdin);
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
697 #else
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
698 cdda_cfg.use_cdin = FALSE;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
699 #endif
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
700 bmp_cfg_db_get_string(db, "CDDA", "cdin_server", &cdda_cfg.cdin_server);
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
701 bmp_cfg_db_close(db);
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
702
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
703 if (!cdda_cfg.cdin_server)
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
704 cdda_cfg.cdin_server = g_strdup("www.cdindex.org");
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
705 if (!cdda_cfg.cddb_server)
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
706 cdda_cfg.cddb_server = g_strdup(CDDB_DEFAULT_SERVER);
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
707 if (!cdda_cfg.name_format)
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
708 cdda_cfg.name_format = g_strdup("%p - %t");
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
709 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
710
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
711 struct driveinfo *
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
712 cdda_find_drive(char *filename)
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
713 {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
714 GList *node;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
715
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
716 // FIXME: Will always return the first drive
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
717
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
718 for (node = cdda_cfg.drives; node; node = node->next) {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
719 struct driveinfo *d = node->data;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
720 if (!strncmp(d->directory, filename, strlen(d->directory)))
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
721 return d;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
722 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
723
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
724 return NULL;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
725
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
726 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
727
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
728 static void
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
729 timeout_destroy(struct timeout *entry)
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
730 {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
731 g_free(entry->device);
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
732 g_free(entry);
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
733 timeout_list = g_list_remove(timeout_list, entry);
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
734 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
735
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
736 static void
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
737 timeout_remove_for_device(char *device)
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
738 {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
739 GList *node;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
740
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
741 for (node = timeout_list; node; node = node->next) {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
742 struct timeout *t = node->data;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
743
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
744 if (!strcmp(t->device, device)) {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
745 gtk_timeout_remove(t->id);
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
746 timeout_destroy(t);
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
747 return;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
748 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
749 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
750
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
751 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
752
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
753 static void
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
754 cleanup(void)
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
755 {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
756 while (timeout_list) {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
757 struct timeout *t = timeout_list->data;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
758 gtk_timeout_remove(t->id);
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
759 stop_timeout(t);
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
760 timeout_destroy(t);
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
761 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
762 cddb_quit();
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
763 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
764
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
765 static int
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
766 is_our_file(char *filename)
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
767 {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
768 char *ext = ".cda";
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
769
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
770 if (cdda_find_drive(filename) == NULL) {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
771 return FALSE;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
772 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
773
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
774 if (g_str_has_suffix(filename, ext)) {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
775 return TRUE;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
776 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
777 return FALSE;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
778 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
779
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
780
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
781 static GList *
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
782 scan_dir(char *dir)
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
783 {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
784 GList *list = NULL;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
785 int i;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
786 cdda_disc_toc_t toc;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
787 struct driveinfo *drive;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
788
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
789 if ((drive = cdda_find_drive(dir)) == NULL)
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
790 return NULL;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
791
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
792 if (!cdda_get_toc(&toc, drive->device))
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
793 return NULL;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
794
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
795 for (i = toc.last_track; i >= toc.first_track; i--)
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
796 if (!toc.track[i].flags.data_track) {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
797 list = g_list_prepend(list, g_strdup_printf("Track %02d.cda", i));
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
798 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
799 return list;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
800 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
801
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
802 guint
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
803 cdda_calculate_track_length(cdda_disc_toc_t * toc, int track)
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
804 {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
805 if (track == toc->last_track)
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
806 return (LBA(toc->leadout) - LBA(toc->track[track]));
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
807 else
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
808 return (LBA(toc->track[track + 1]) - LBA(toc->track[track]));
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
809 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
810
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
811 static void *
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
812 dae_play_loop(void *arg)
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
813 {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
814 char *buffer = g_malloc(CD_FRAMESIZE_RAW * CDDA_DAE_FRAMES);
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
815 int pos = LBA(cdda_playing.cd_toc.track[cdda_playing.track]);
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
816 int end, frames;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
817
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
818 if (cdda_playing.track == cdda_playing.cd_toc.last_track)
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
819 end = LBA(cdda_playing.cd_toc.leadout);
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
820 else
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
821 end = LBA(cdda_playing.cd_toc.track[cdda_playing.track + 1]);
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
822
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
823 while (cdda_playing.playing) {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
824 int left;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
825 char *data;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
826
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
827 if (dae_data.seek != -1) {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
828 cdda_ip.output->flush(dae_data.seek * 1000);
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
829 pos = LBA(cdda_playing.cd_toc.track[cdda_playing.track])
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
830 + dae_data.seek * 75;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
831 dae_data.seek = -1;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
832 dae_data.eof = FALSE;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
833 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
834 frames = MIN(CDDA_DAE_FRAMES, end - pos);
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
835 if (frames == 0)
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
836 dae_data.eof = TRUE;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
837
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
838 if (dae_data.eof) {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
839 xmms_usleep(30000);
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
840 continue;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
841 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
842
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
843 frames = read_audio_data(cdda_playing.fd, pos, frames, buffer);
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
844 if (frames <= 0) {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
845 int err = -frames;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
846 if (err == EOPNOTSUPP)
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
847 dae_data.eof = TRUE;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
848 else {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
849 /*
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
850 * If the read failed, skip ahead to
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
851 * avoid getting stuck on scratches
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
852 * and such.
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
853 */
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
854 g_message("read_audio_data() failed: %s (%d)",
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
855 strerror(err), err);
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
856 pos += MIN(CDDA_DAE_FRAMES, end - pos);
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
857 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
858 continue;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
859 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
860 left = frames * CD_FRAMESIZE_RAW;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
861 data = buffer;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
862 while (cdda_playing.playing && left > 0 && dae_data.seek == -1) {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
863 int cur = MIN(512 * 2 * 2, left);
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
864 cdda_ip.add_vis_pcm(cdda_ip.output->written_time(),
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
865 FMT_S16_LE, 2, cur, data);
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
866 while (cdda_ip.output->buffer_free() < cur &&
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
867 cdda_playing.playing && dae_data.seek == -1)
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
868 xmms_usleep(30000);
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
869 if (cdda_playing.playing && dae_data.seek == -1)
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
870 produce_audio(cdda_ip.output->written_time(), FMT_S16_LE, 2, cur, data, &cdda_playing.playing);
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
871 left -= cur;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
872 data += cur;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
873 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
874 pos += frames;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
875 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
876
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
877 cdda_ip.output->buffer_free();
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
878 cdda_ip.output->buffer_free();
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
879 g_free(buffer);
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
880
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
881 g_thread_exit(NULL);
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
882 return NULL;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
883 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
884
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
885 static void
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
886 dae_play(void)
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
887 {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
888 if (cdda_ip.output->open_audio(FMT_S16_LE, 44100, 2) == 0) {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
889 dae_data.audio_error = TRUE;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
890 cdda_playing.playing = FALSE;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
891 return;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
892 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
893 dae_data.seek = -1;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
894 dae_data.eof = FALSE;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
895 dae_data.audio_error = FALSE;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
896 dae_data.thread = g_thread_create(dae_play_loop, NULL, TRUE, NULL);
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
897 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
898
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
899 static void
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
900 play_file(char *filename)
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
901 {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
902 char *tmp;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
903 struct driveinfo *drive;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
904 int track;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
905 int track_len;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
906
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
907 // g_message(g_strdup_printf("** CD_AUDIO: trying to play file %s",filename));
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
908
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
909 if ((drive = cdda_find_drive(filename)) == NULL) {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
910 // g_message("** CD_AUDIO: find drive check failed");
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
911 return;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
912 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
913 if (is_mounted(drive->device)) {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
914 // g_message("** CD_AUDIO: drive is mounted");
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
915 return;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
916 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
917 tmp = strrchr(filename, '/');
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
918 if (tmp)
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
919 tmp++;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
920 else
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
921 tmp = filename;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
922
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
923 if (!sscanf(tmp, "Track %d.cda", &track)) {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
924 // g_message("** CD_AUDIO: filename check failed");
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
925 return;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
926 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
927
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
928 if (!cdda_get_toc(&cdda_playing.cd_toc, drive->device) ||
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
929 cdda_playing.cd_toc.track[track].flags.data_track ||
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
930 track < cdda_playing.cd_toc.first_track ||
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
931 track > cdda_playing.cd_toc.last_track) {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
932 // g_message("** CD_AUDIO: toc check failed");
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
933 return;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
934 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
935
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
936 if ((cdda_playing.fd = open(drive->device, CDOPENFLAGS)) == -1) {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
937 // g_message("** CD_AUDIO: device open failed");
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
938 return;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
939 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
940 track_len = cdda_calculate_track_length(&cdda_playing.cd_toc, track);
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
941 cdda_ip.set_info(cdda_get_title(&cdda_playing.cd_toc, track),
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
942 (track_len * 1000) / 75, 44100 * 2 * 2 * 8, 44100, 2);
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
943
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
944 memcpy(&cdda_playing.drive, drive, sizeof(struct driveinfo));
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
945 #ifndef CDDA_HAS_READAUDIO
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
946 cdda_playing.drive.dae = FALSE;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
947 #endif
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
948
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
949 cdda_playing.track = track;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
950
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
951 is_paused = FALSE;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
952 timeout_remove_for_device(drive->device);
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
953
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
954 cdda_playing.playing = TRUE;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
955 if (drive->dae)
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
956 dae_play();
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
957 else
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
958 seek(0);
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
959 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
960
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
961 static char *
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
962 cdda_get_title(cdda_disc_toc_t * toc, int track)
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
963 {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
964 G_LOCK_DEFINE_STATIC(title);
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
965
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
966 static guint32 cached_id;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
967 static cdinfo_t cdinfo;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
968 TitleInput *input;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
969 guint32 disc_id;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
970 char *title;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
971
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
972 disc_id = cdda_cddb_compute_discid(toc);
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
973
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
974 /*
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
975 * We want to avoid looking up a album from two threads simultaneously.
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
976 * This can happen since we are called both from the main-thread and
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
977 * from the playlist-thread.
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
978 */
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
979
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
980 G_LOCK(title);
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
981 if (!(disc_id == cached_id && cdinfo.is_valid)) {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
982 /*
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
983 * We try to look up the disc again if the info is not
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
984 * valid. The user might have configured a new server
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
985 * in the meantime.
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
986 */
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
987 cdda_cdinfo_flush(&cdinfo);
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
988 cached_id = disc_id;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
989
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
990 if (!cdda_cdinfo_read_file(disc_id, &cdinfo)) {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
991 if (cdda_cfg.use_cddb)
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
992 cdda_cddb_get_info(toc, &cdinfo);
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
993 if (cdinfo.is_valid)
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
994 cdda_cdinfo_write_file(disc_id, &cdinfo);
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
995 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
996 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
997 XMMS_NEW_TITLEINPUT(input);
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
998 cdda_cdinfo_get(&cdinfo, track, &input->performer, &input->album_name,
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
999 &input->track_name);
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1000 G_UNLOCK(title);
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1001
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1002 input->track_number = track;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1003 input->file_name = input->file_path =
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1004 g_strdup_printf(_("CD Audio Track %02u"), track);
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1005 input->file_ext = "cda";
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1006 title = xmms_get_titlestring(cdda_cfg.title_override ?
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1007 cdda_cfg.name_format :
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1008 xmms_get_gentitle_format(), input);
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1009 g_free(input->file_name);
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1010 g_free(input);
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1011
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1012 if (!title)
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1013 title = g_strdup_printf(_("CD Audio Track %02u"), track);
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1014 return title;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1015 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1016
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1017 static gboolean
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1018 stop_timeout(gpointer data)
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1019 {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1020 int fd;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1021 struct timeout *to = data;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1022
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1023 fd = open(to->device, CDOPENFLAGS);
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1024 if (fd != -1) {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1025 ioctl(fd, XMMS_STOP, 0);
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1026 close(fd);
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1027 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1028 timeout_destroy(to);
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1029 return FALSE;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1030 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1031
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1032 static void
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1033 stop(void)
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1034 {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1035 struct timeout *to_info;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1036 if (cdda_playing.fd < 0)
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1037 return;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1038
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1039 cdda_playing.playing = FALSE;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1040
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1041 if (cdda_playing.drive.dae) {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1042 g_thread_join(dae_data.thread);
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1043 cdda_ip.output->close_audio();
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1044 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1045 else
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1046 ioctl(cdda_playing.fd, XMMS_PAUSE, 0);
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1047
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1048 close(cdda_playing.fd);
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1049 cdda_playing.fd = -1;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1050
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1051 if (!cdda_playing.drive.dae) {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1052 to_info = g_malloc(sizeof(*to_info));
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1053 to_info->device = g_strdup(cdda_playing.drive.device);
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1054 to_info->id = gtk_timeout_add(STOP_DELAY * 100, stop_timeout,
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1055 to_info);
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1056 timeout_list = g_list_prepend(timeout_list, to_info);
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1057 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1058 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1059
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1060 static void
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1061 cdda_pause(short p)
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1062 {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1063 if (cdda_playing.drive.dae) {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1064 cdda_ip.output->pause(p);
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1065 return;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1066 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1067 if (p) {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1068 pause_time = get_time();
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1069 ioctl(cdda_playing.fd, XMMS_PAUSE, 0);
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1070 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1071 else {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1072 ioctl(cdda_playing.fd, XMMS_RESUME, 0);
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1073 pause_time = -1;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1074 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1075 is_paused = p;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1076 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1077
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1078
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1079
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1080 static void
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1081 seek(int time)
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1082 {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1083 struct cdda_msf *end, start;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1084 int track = cdda_playing.track;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1085
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1086 // g_message("** CD_AUDIO: seeking...");
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1087 if (cdda_playing.drive.dae) {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1088 dae_data.seek = time;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1089 while (dae_data.seek != -1)
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1090 xmms_usleep(20000);
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1091 return;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1092 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1093
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1094 start.minute = (cdda_playing.cd_toc.track[track].minute * 60 +
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1095 cdda_playing.cd_toc.track[track].second + time) / 60;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1096 start.second = (cdda_playing.cd_toc.track[track].second + time) % 60;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1097 start.frame = cdda_playing.cd_toc.track[track].frame;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1098 if (track == cdda_playing.cd_toc.last_track)
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1099 end = &cdda_playing.cd_toc.leadout;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1100 else
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1101 end = &cdda_playing.cd_toc.track[track + 1];
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1102
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1103 play_ioctl(&start, end);
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1104
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1105 if (is_paused) {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1106 cdda_pause(TRUE);
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1107 pause_time = time * 1000;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1108 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1109 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1110
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1111 static int
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1112 get_time_analog(void)
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1113 {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1114 int frame, start_frame, length;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1115 int track = cdda_playing.track;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1116
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1117 if (is_paused && pause_time != -1)
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1118 return pause_time;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1119
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1120 frame = get_current_frame();
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1121
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1122 if (frame == -1)
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1123 return -1;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1124
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1125 start_frame = LBA(cdda_playing.cd_toc.track[track]);
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1126 length = cdda_calculate_track_length(&cdda_playing.cd_toc, track);
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1127
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1128 if (frame - start_frame >= length - 20) /* 20 seems to work better */
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1129 return -1;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1130
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1131 return ((frame - start_frame) * 1000) / 75;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1132 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1133
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1134 static int
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1135 get_time_dae(void)
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1136 {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1137 if (dae_data.audio_error)
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1138 return -2;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1139 if (!cdda_playing.playing ||
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1140 (dae_data.eof && !cdda_ip.output->buffer_playing()))
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1141 return -1;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1142 return cdda_ip.output->output_time();
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1143 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1144
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1145 static int
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1146 get_time(void)
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1147 {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1148 if (cdda_playing.fd == -1)
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1149 return -1;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1150
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1151 if (cdda_playing.drive.dae)
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1152 return get_time_dae();
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1153 else
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1154 return get_time_analog();
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1155 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1156
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1157 static void
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1158 get_song_info(char *filename, char **title, int *len)
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1159 {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1160 cdda_disc_toc_t toc;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1161 int t;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1162 char *tmp;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1163 struct driveinfo *drive;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1164
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1165 *title = NULL;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1166 *len = -1;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1167
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1168 // g_message("** CD_AUDIO: getting song info");
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1169
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1170 if ((drive = cdda_find_drive(filename)) == NULL)
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1171 return;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1172
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1173 tmp = strrchr(filename, '/');
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1174 if (tmp)
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1175 tmp++;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1176 else
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1177 tmp = filename;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1178
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1179 if (!sscanf(tmp, "Track %d.cda", &t))
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1180 return;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1181 if (!cdda_get_toc(&toc, drive->device))
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1182 return;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1183 if (t < toc.first_track || t > toc.last_track
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1184 || toc.track[t].flags.data_track)
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1185 return;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1186
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1187 *len = (cdda_calculate_track_length(&toc, t) * 1000) / 75;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1188 *title = cdda_get_title(&toc, t);
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1189 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1190
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1191 #ifdef HAVE_OSS
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1192 static void
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1193 oss_get_volume(int *l, int *r, int mixer_line)
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1194 {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1195 int fd, v;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1196
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1197 fd = open(DEV_MIXER, O_RDONLY);
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1198 if (fd != -1) {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1199 ioctl(fd, MIXER_READ(mixer_line), &v);
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1200 *r = (v & 0xFF00) >> 8;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1201 *l = (v & 0x00FF);
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1202 close(fd);
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1203 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1204 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1205
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1206 static void
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1207 oss_set_volume(int l, int r, int mixer_line)
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1208 {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1209 int fd, v;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1210
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1211 fd = open(DEV_MIXER, O_RDONLY);
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1212 if (fd != -1) {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1213 v = (r << 8) | l;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1214 ioctl(fd, MIXER_WRITE(mixer_line), &v);
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1215 close(fd);
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1216 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1217 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1218 #else
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1219 static void
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1220 oss_get_volume(int *l, int *r, int mixer_line)
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1221 {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1222 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1223 static void
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1224 oss_set_volume(int l, int r, int mixer_line)
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1225 {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1226 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1227 #endif
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1228
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1229
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1230 static void
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1231 get_volume(int *l, int *r)
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1232 {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1233 if (cdda_playing.drive.dae)
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1234 cdda_ip.output->get_volume(l, r);
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1235 else if (cdda_playing.drive.mixer == CDDA_MIXER_OSS)
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1236 oss_get_volume(l, r, cdda_playing.drive.oss_mixer);
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1237 else if (cdda_playing.drive.mixer == CDDA_MIXER_DRIVE)
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1238 drive_get_volume(l, r);
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1239 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1240
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1241 static void
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1242 set_volume(int l, int r)
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1243 {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1244 if (cdda_playing.drive.dae)
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1245 cdda_ip.output->set_volume(l, r);
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1246 else if (cdda_playing.drive.mixer == CDDA_MIXER_OSS)
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1247 oss_set_volume(l, r, cdda_playing.drive.oss_mixer);
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1248 else if (cdda_playing.drive.mixer == CDDA_MIXER_DRIVE)
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1249 drive_set_volume(l, r);
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1250 }